我们有以下代码来生成正态分布的随机数。
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上运行的顺序是不同的。 发电机是相同的,种子是相同的,所以他们应该给相同的序列。
什么是遗漏或不正确,将允许代码在两个操作系统上创build相同的序列?
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
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;
如果这个分布在各个平台上也是确定性的,那肯定会是有用的,但是我想这个委员会觉得这会给执行者带来太多的自由来实现分配的新算法。
无论如何,如果您需要确定性分布,您需要自己实现它们,或者使用另一个提供确定性跨平台实现的库。