[random] Liczby pseudolosowe
Ostatnio zmodyfikowano 2017-05-05 16:28
marcolo2307 Temat założony przez niniejszego użytkownika |
[random] Liczby pseudolosowe » 2017-05-05 14:34:09 Cześć! Słyszałem, że < random > jest lepsze od stosowania srand i rand, ale nie potrafię jej zrozumieć. #include <random> #include <iostream>
int main() { std::random_device rd; std::mt19937 gen( rd() ); std::uniform_int_distribution <> dis( 1, 6 ); for( int n = 0; n < 10; ++n ) std::cout << dis( gen ) << ' '; std::cout << '\n'; }
To przykład z dokumentacji (cppreference.com). Przy każdym uruchomieniu generuje te same liczby. Nie mogę znaleźć sposobu, aby były one inne. Jak to zrobić? |
|
czaffik |
» 2017-05-05 15:25:39 http://stackoverflow.com/questions/18880654/why-do-i-get-the-same-sequence-for-every-run-with-stdrandom-device-with-mingw "Unlike VC, GCC hasn't implemented random_device nondeterministically on Windows. Boost has, so you can use Boost.Random." Wygląda na to że GCC nie ma dobrze zaimplementowanego random_device. Zamiast pisać: std::random_device rd; std::mt19937 gen( rd() );
użyj biblioteki <ctime>: std::mt19937 gen( std::time( 0 ) );
wtedy otrzymasz różne sekwencje. |
|
marcolo2307 Temat założony przez niniejszego użytkownika |
» 2017-05-05 15:44:38 Czy nie wyjdzie wtedy na to samo, co gdybym używał srand i rand? |
|
czaffik |
» 2017-05-05 16:01:54 Nie do końca, stwórz funkcję losującą liczbę z przedziału od -50 do 50 używając rand(), ze względu na to dzielenie modulo raczej ciężko, napiszesz: to otrzymasz liczby z przedziału od -50 do 49, bo rand()%100 zwróci liczby z przedziału od 0 do 99 (dokładnie nie pamiętam, więc ręki se uciąć nie dam). Używając random napiszesz tylko: std::uniform_int_distribution <> dis( begin, end ); dis( gen );
a gen.seed(std::time(0)); to to samo co srand(time(0)); Kwestia tylko tego żeby się przestawić na random, jak już ci się uda to łatwiej z tego korzystać niż z tych rand() i dzielenia modulo. |
|
marcolo2307 Temat założony przez niniejszego użytkownika |
» 2017-05-05 16:10:21 Chodzi mi właśnie o to time(0). uniform_distribution mogę sam sobie napisać korzystając z rand, ale czytałem, ze random_device losuje na podstawie systemu czy coś takiego. Czyli w praktyce cała biblioteka random to po prostu opakowanie dla srand i rand? |
|
czaffik |
» 2017-05-05 16:17:30 Nie wiem jak działa random_device, z tego co czytałem to wydaje się że std::mt19937 ma bardziej "zaawansowane" mechanizmy losowania niż rand(), tylko trzeba ziarno ustawić.
std::time(0) jest również wybierane systemowo. Ciężko sobie wyobrazić inne wybieranie ziarna przez system niż oparte na czasie jaki upłynął od jakiegoś momentu (bo losowe ono nie będzie, trzeba by stworzyć generator liczb pseudolosowych żeby utworzyć losowe ziarno dla generatora liczb losowych!).
Nie wiem dokładnie ale jeśli to się sprowadza tylko do wygody to i tak wolę teraz random, mimo początkowych oporów bardziej pasuje. |
|
marcolo2307 Temat założony przez niniejszego użytkownika |
» 2017-05-05 16:28:28 Ok, dzięki za wyjaśnienie. Zamykam. |
|
« 1 » |