std::default_random_engine – opis podstawowy

Do tej pory w wielu publikacjach spotykamy się z opisem generatora liczb pseudolosowych w wersji dla języka C, czyli korzystamy z generatora „ziarna” srand (),a następnie generatora  rand(). Natomiast od wersji C++11 powinno się korzystać z dobrodziejstwa biblioteki random. W tym artykule opiszę mechanizm:

std::default_random_engine 

Samo korzystanie z nowej metody generowania liczb losowych w pierwszym momencie może wydawać się mało zrozumiałe, jednak postaram się w prostych słowach wyjaśnić same podstawy, niezbędne, aby można w pełni zamienić stary kod nowym. 

Komenda default_random_engine w przeciwieństwie do srand() nie jest generatorem ziarna – czyli prościej nie jest mechanizmem, który zapobiega otrzymywaniu identycznych ciągów liczb pseudolosowych, tylko jest inicjatorem generatora, i wskazuje jaki algorytm generowania liczb będziemy używać. Oczywiście możemy skorzystać z innych algorytmów, a nawet (jeśli posiadamy) ze sprzętowego generatora liczb losowych (wszystko opisane pod tym adresem).  tak więc komenda std::default_random_engine generator oznacza, że od teraz generator jest naszą liczbą losową a dokładniej całym ciągiem liczb, zmieniających się przy każdym wykorzystaniu i na razie zupełnie dla nas nieprzydatnych. Poniżej krótki program, który pozwoli to w pełni zrozumieć:

Kolejną komendą, jaka jest potrzebna to: 

std::uniform_int_distribution

Dzięki tej komendzie zamienimy ciąg liczb losowych na liczby z zadanego nam przedziału. Komendy używamy w następujący sposób:  std::uniform_int_distribution<int> distribution(a, b) gdzie: <int> określa typ zmiennej, jaki będzie zwracać generator, distribution to nazwa dla naszego generatora, natomiast (a,b) to zakres liczb, jaki będzie zwracany (na przykład od 0 do 20).

Teraz możemy już korzystać z komendy distribution(generator) aby wygenerować liczbę pseudolosową z zadanego zakresu. Poniżej krótki programik, który pokazuje cały mechanizm w działaniu. Oczywiście zamiast "generator" i "distribution" możemy skorzystać z dowolnych innych określeń (niebędących już istniejącymi komendami języka lub nazwami zmiennych) co pozwoli na płynne stosowanie wielu zakresów liczb losowych oraz kilku algorytmów generowania tych liczb (jeśli byłoby to potrzebne).

Mam nadzieję, że ten kawałek kodu wyjaśnia wszelkie wątpliwości, jeśli jakieś się pojawiły, i od teraz podstawowe mechanizmy związane z biblioteką random stały się proste i oczywiste.

*W artykule używam zamiennie nazw liczba losowa i pseudo losowa – w większości przypadków chodzi mi o liczby pseudo losowe, poza wzmianką o sprzętowym generatorze liczb losowych.

** Tak stworzone liczby pseudo losowe będą identyczne za każdym razem (taka sama sekwencja). W następnym artykule napiszę jak to zmienić, oraz opiszę prawidłowo wykonywany pomiar czasu w C++11.

Dodaj komentarz