Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

267
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda