Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[random] Liczby pseudolosowe

Ostatnio zmodyfikowano 2017-05-05 16:28
Autor Wiadomość
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ć.
C/C++
#include <random>
#include <iostream>

int main()
{
    std::random_device rd; //Will be used to obtain a seed for the random number engine
    std::mt19937 gen( rd() ); //Standard mersenne_twister_engine seeded with rd()
    std::uniform_int_distribution <> dis( 1, 6 );
   
    for( int n = 0; n < 10; ++n )
    //Use dis to transform the random unsigned int generated by gen into an int in [1, 6]
         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ć?
P-160717
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ć:
C/C++
std::random_device rd; //Will be used to obtain a seed for the random number engine
std::mt19937 gen( rd() ); //Standard mersenne_twister_engine seeded with rd()
użyj biblioteki <ctime>:
C/C++
std::mt19937 gen( std::time( 0 ) );
wtedy otrzymasz różne sekwencje.
P-160722
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?
P-160723
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:
C/C++
rand() % 100 - 50
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:
C/C++
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.
P-160725
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?
P-160726
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.
P-160727
marcolo2307
Temat założony przez niniejszego użytkownika
» 2017-05-05 16:28:28
Ok, dzięki za wyjaśnienie. Zamykam.
P-160728
« 1 »
  Strona 1 z 1