Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

264
Views
¿Cómo hacer que el generador C++ Mersenne Twister 19937 dé los mismos resultados en Windows y Linux?

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.2219

Salida 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.2854
over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

La 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.

over 4 years ago · Santiago Trujillo Report

0

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);
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!