Inicjalizacja tablicy losowymi liczbami

0

Mógłby ktoś pokazać jakiś kulturalny, krótki sposób inicjalizacji tablicy int array[size], gdzie size to na przykład 50 losowymi liczbami całkowitymi z przedziału np.: -10, 50?

Szukałem w necie ale wszystkie sposoby mają dużo linijek kodu, nie wierzę że się nie da krócej.

1

Za https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/

constexpr int size = 10;
int arr[size];

std::mt19937 gen{std::random_device{}()};
std::uniform_int_distribution<> dis(-10, 50);

std::generate(std::begin(arr), std::end(arr), [&]{ return dis(gen); });

https://wandbox.org/permlink/jR2yDbobEvX7rjnb

0

Dziękuję. Działa dobrze w takiej formie.

Lecz gdy chcę to przerobić aby korzystać z tego poprzez wywołanie funkcji:

void randomize_array(int name[], int start, int stop)
{
    std::mt19937 gen{std::random_device{}()};
    std::uniform_int_distribution<> dis(start, stop);
    std::generate(std::begin(name), std::end(name), [&]{ return dis(gen); });
}

Gdzie name[] to nazwa tablicy, start i stop to odpowiednio początek i koniec przedziału z którego chcę losować.

Funkcję wywołuję w mainie tak:

    randomize_array(array[size], -100, 100);

Wyrzuca mi błąd:
title

Jakiś pomysł, wskazówka?

0
std::generate(name+start, name+stop, [&]{ return dis(gen); });

Dodatkowo, ogólnie fajnie by było tylko raz prng generować, więc mógłby być thread_local zmienną globalną.

0

Gdy calluję funkcję w taki sposób:

    randomize_array(NazwaTablicy, -100, 100);

program się uruchamia, lecz nic się nie dzieje i po ~3 sekundach program się zatrzymuje i wyrzuca Process Returned w konsoli.
W dalszej części programu mam wyświetlanie tej tablicy użytkownikowi - ta część się nie wykonuje, bo program się zatrzymuje przed tym.

0

A, myślałem, ze start i stop to indeksy. Jak przekazujesz wskaźnik, to musisz przekazać też rozmiar tablicy.

thread_local std::mt19937 gen{std::random_device{}()};
void randomize_array(int name[], size_t arr_size, int start, int stop)
{
    std::uniform_int_distribution<> dis(start, stop);
    std::generate(name, name + arr_size, [&]{ return dis(gen); });
}
0

Dziękuję za pomoc :) Wszystko działa.

Chciałbym jeszcze dopytać dlaczego przy każdym odpaleniu program wyrzuca te same losowe liczby? Przecież jest zaseedowane poprzez std::mt19937 gen{std::random_device{}()};.

0

Używasz może MinGW? Jeśli tak, to jest to znany błąd.

0

Tak. Okej, dzięki!

1

Możesz użyć std::seed_seq do inicjalizacji prng większą liczbą parametrów (tutaj dodałem obecny czas).

thread_local auto gen{[]{
    std::seed_seq seq{
        (uint64_t)std::random_device{}(),
        (uint64_t)std::time(nullptr)
    };
    return std::mt19937{seq};
}()};

void randomize_array(int name[], size_t arr_size, int start, int stop)
{
    std::uniform_int_distribution<> dis(start, stop);
    std::generate(name, name + arr_size, [&]{ return dis(gen); });
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1