Recientemente me acostumbré a los idiomas modernos que incluyen un buen generador aleatorio, que generalmente es el Mersenne Twister; ahora que volví a C ++ tengo que decidir qué usar.
Busqué implementaciones de Mersenne Twister y noté que hay muchas: ¿hay alguna que sea más utilizada y generalizada, o se supone que debo elegir una, suponiendo que todas sean igualmente buenas?
Respuestas:
C ++ 11 incluye un generador Mersenne Twister de forma predeterminada como parte de su nueva
<random>
interfaz. Por ejemplo, para generar enteros de manera uniforme entre [-10, 10] utilizando MT:La mayor parte de esto también está disponible en cualquier compilador que ofrezca TR1, aunque los nombres son ligeramente diferentes;
std::tr1::mt19937
ystd::tr1::uniform_int<int>
.Usualmente advierto a las personas que no usen Mersenne Twister. Es un algoritmo aceptable, pero gran parte de su popularidad es solo marketing. 624 dimensiones de aleatoriedad son más de lo que la mayoría de las personas necesitan, y el MT conlleva requisitos de estado relativamente pesados y, cuando realiza un recuento completo de la tabla, puede volar el caché. Personalmente, soy partidario de xorshift, que proporciona períodos excelentes y distribuciones razonables para todo lo que un juego necesita, con muy poca memoria y requisitos de CPU.
He escrito un generador xorshift compatible con C ++ 11 (¿en su mayoría?) - xorshift.hpp , xorshift.cpp - y lo coloqué en el dominio público. Puede conectar esto a cualquier función de aleatorización de C ++ 11, como se indica arriba:
fuente
Otro RNG que he usado antes para propósitos de gamedev es el "pequeño" RNG de Bob Jenkins, descrito aquí .
(También tiene un RNG de fuerza criptográfica llamado ISAAC, pero es más grande y más lento, y los juegos no necesitan ese nivel de fuerza).
fuente