如何获得C++ Mersenne Twister 19937生成器在Windows和Linux上给出相同的结果



我们有以下代码来生成正态分布的随机数。

   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;

这应该在 Linux 和 Windows 上产生相同的完全相同的顺序。 但事实并非如此。 在同一操作系统上重新运行时,序列是相同的。 但是在Linux和Windows上运行时,顺序是不同的。 生成器是相同的,种子是相同的,因此它们应该给出相同的序列。

缺少或不正确的内容将允许代码在两个操作系统上创建相同的序列?

视窗 10. Visual Studio 2010.

乌班图14.04。 G++ (GCC 4.9.2(

窗口输出:

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

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

C++库规范保证生成器将生成相同的值序列,但不需要分布

如果修改代码以从 mt19937 生成器生成原始输出,您会发现不同平台的结果是相同的:

std::mt19937 generator(1);
for (uint i = 0; i < 10; i++)
  cout << "randomNumber=" << generator() << endl;

如果发行版也是跨平台确定性的,那当然会很有用,但我想委员会认为这会剥夺实现者实施新算法来生成发行版的太多自由。

无论如何,如果你想要确定性发行版,你需要自己实现它们,或者使用另一个提供确定性跨平台实现的库。

您可以使用 mersenne twister 的 boost 实现,以便在 Windows 和 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);

最新更新