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:
std::mt19937 eng; // This is the Mersenne Twister
std:::uniform_int_distribution<int> dist(-10, 10)
for (int i = 0; i < 10; ++i)
std::cout << dist(eng) << std::endl;
La mayor parte de esto también está disponible en cualquier compilador que ofrezca TR1, aunque los nombres son ligeramente diferentes; std::tr1::mt19937
y std::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:
xorshift eng;
std:::uniform_int_distribution<int> dist(-10, 10)
for (int i = 0; i < 10; ++i)
std::cout << dist(eng) << std::endl;