Tenemos el siguiente código para generar números aleatorios normalmente distribuidos.
double average = 10.0; double spread = 4.0; std::mt19937 generator; generator.seed(1); std::normal_distribution<double> distribution(average, spread); for (uint i = 0; i < 10; i++) cout << "randomNumber=" << distribution(generator) << endl;Esto debería producir la misma secuencia exacta en Linux y Windows. Pero no es así. Las secuencias son idénticas cuando se vuelven a ejecutar en el mismo sistema operativo. Pero las secuencias son diferentes cuando se ejecutan en Linux y Windows. Los generadores son los mismos y las semillas son las mismas, por lo que deberían dar secuencias idénticas.
¿Qué falta o es incorrecto que permitiría que el código creara secuencias idénticas en ambos sistemas operativos?
Windows 10. Visual Studio 2010.
Ubuntu 14.04. g ++ (gcc 4.9.2)
Salida de Windows:
randomNumber=10.6243 randomNumber=11.2256 randomNumber=7.72784 randomNumber=8.30245 randomNumber=6.77485 randomNumber=9.18181 randomNumber=5.19982 randomNumber=8.28505 randomNumber=5.24899 randomNumber=15.2219Salida de Linux:
randomNumber=7.80102 randomNumber=4.38851 randomNumber=16.331 randomNumber=5.81941 randomNumber=11.0304 randomNumber=2.16242 randomNumber=3.96877 randomNumber=8.73883 randomNumber=13.4327 randomNumber=10.2854La especificación de la biblioteca C++ garantiza que el generador producirá la misma secuencia de valores, pero las distribuciones no están obligadas a hacerlo.
Si modifica su código para producir una salida sin procesar del generador mt19937, encontrará que los resultados son los mismos en todas las plataformas:
std::mt19937 generator(1); for (uint i = 0; i < 10; i++) cout << "randomNumber=" << generator() << endl;Sin duda, sería útil si las distribuciones también fueran deterministas entre plataformas, pero imagino que el comité sintió que eso les quitaría demasiada libertad a los implementadores para implementar nuevos algoritmos para producir distribuciones.
De todos modos, si desea distribuciones deterministas, deberá implementarlas usted mismo o usar otra biblioteca que proporcione implementaciones multiplataforma deterministas.
Puede usar la implementación boost del mersenne twister para obtener los mismos valores aleatorios en Windows y Linux.
#include <boost/random/mersenne_twister.hpp> #include <boost/random/uniform_int.hpp> #include <boost/random/variate_generator.hpp> boost::mt19937 m_mt; boost::uniform_int<> dist(min, max); boost::variate_generator<boost::mt19937 &, boost::uniform_int<>> die(m_mt, dist);