Niedawno przyzwyczaiłem się do współczesnych języków, w tym dobrego generatora losowego, którym zwykle jest Twister Mersenne; teraz, gdy wróciłem do C ++, muszę zdecydować, którego użyć.
Szukałem implementacji Mersenne Twister i zauważyłem, że jest ich tak wiele: czy jest taka, która jest bardziej używana i rozpowszechniona, czy też mam wybrać jedną, zakładając, że wszystkie są równie dobre?
Odpowiedzi:
C ++ 11 domyślnie zawiera generator Mersenne Twister jako część nowego
<random>
interfejsu. Na przykład, aby równomiernie generować liczby całkowite między [-10, 10] przy użyciu MT:Większość tego jest również dostępna w dowolnym kompilatorze oferującym TR1, chociaż nazwy są nieco inne;
std::tr1::mt19937
astd::tr1::uniform_int<int>
.Zazwyczaj ostrzegam ludzi przed używaniem Mersenne Twister. Algorytm jest w porządku, ale duża część jego popularności to tylko marketing. 624 wymiary losowości są więcej, niż potrzeba większości ludzi, a MT niesie ze sobą stosunkowo wysokie wymagania dotyczące stanu, a po ponownym przeliczeniu pełnej tabeli może zdmuchnąć pamięć podręczną. Osobiście jestem zwolennikiem xorshift, który zapewnia doskonałe okresy i rozsądną dystrybucję wszystkiego, czego potrzebuje gra, z niewielkimi wymaganiami dotyczącymi pamięci i procesora.
Napisałem (głównie?) Zgodny z C ++ 11 xorshift generator - xorshift.hpp , xorshift.cpp - i umieściłem go w domenie publicznej. Możesz podłączyć to do dowolnej funkcji randomizacji C ++ 11, jak wyżej:
źródło
Innym RNG, którego użyłem wcześniej do celów gamedev, jest opisany tutaj „mały” RNG Boba Jenkinsa .
(Ma również RNG o sile kryptograficznej o nazwie ISAAC, ale jest większy i wolniejszy, a gry nie potrzebują takiego poziomu siły).
źródło