如何让C++ Mersenne Twister 19937生成器在Windows和Linux上提供相同的结果?

rog*_*994 3 c++ linux random

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

   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;
Run Code Online (Sandbox Code Playgroud)

这应该在Linux和Windows上产生相同的确切序列.但事实并非如此.在同一操作系统上重新运行时,序列是相同的.但是在Linux与Windows上运行时序列是不同的.发生器是相同的,种子是相同的,所以它们应该给出相同的序列.

什么是缺少或不正确的,这将允许代码在两个操作系统上创建相同的序列?

Windows 10. Visual Studio 2010.

Ubuntu 14.04.g ++(gcc 4.9.2)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

bam*_*s53 6

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

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

std::mt19937 generator(1);

for (uint i = 0; i < 10; i++)
  cout << "randomNumber=" << generator() << endl;
Run Code Online (Sandbox Code Playgroud)

如果分布在各个平台上也具有确定性,那肯定会很有用,但我想委员会认为这会从实施者那里获得太多的自由来实现生成分布的新算法.

无论如何,如果您需要确定性分布,您需要自己实现它们或使用另一个提供确定性跨平台实现的库.