gpt4 book ai didi

c++ - 如何让 C++ Mersenne Twister 19937 生成器在 Windows 和 Linux 上给出相同的结果?

转载 作者:太空狗 更新时间:2023-10-29 20:22:58 26 4
gpt4 key购买 nike

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

   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 上运行时顺序不同。生成器相同,种子相同,因此它们应该给出相同的序列。

有什么遗漏或不正确的地方可以让代码在两个操作系统上创建相同的序列?

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;

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

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

关于c++ - 如何让 C++ Mersenne Twister 19937 生成器在 Windows 和 Linux 上给出相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35449498/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com