C++ c++;从文件还原时,正态分布给出了不一致的随机数

C++ c++;从文件还原时,正态分布给出了不一致的随机数,c++,c++11,random,C++,C++11,Random,我正在编写一个蒙特卡罗模拟并实现检查点。我希望获得完全相同的结果,无论我是否从检查点重新启动模拟,还是继续超出检查点。然而,我在std::normal\u分布中遇到了一些奇怪的行为: 我使用的是std::mt19937 rng编码为RNG,并将其种子设定为固定数字。我通过std::uniform\u real\u distribution uniform绘制了一定数量的随机数和std::正态分布正态。然后,我将rng的状态写入流操作系统的: os << rng << en

我正在编写一个蒙特卡罗模拟并实现检查点。我希望获得完全相同的结果,无论我是否从检查点重新启动模拟,还是继续超出检查点。然而,我在
std::normal\u分布中遇到了一些奇怪的行为:

我使用的是
std::mt19937 rng编码为RNG,并将其种子设定为固定数字。我通过
std::uniform\u real\u distribution uniform绘制了一定数量的随机数
std::正态分布正态。然后,我将rng的状态写入流操作系统的

os << rng << endl;
os << <some other stuff>...
但是,如果我从检查点重新启动,即,如果流为
,则从
初始化生成器:

is >> rng;
is >> <some other stuff>...

你看,统一的数字是相同的,直到一个正常的数字被画出来之后,rng的状态不同。用
gdb
单步执行确认。

查看两个输出中
0.637067
的位置。您会注意到,正态分布在恢复时从rng中提取的数字比未恢复时多。那是因为当你检查的时候它有熵


您必须保存或重置
正常的状态。我建议调用
normal
作为检查点过程的一部分。

查看两个输出中
0.637067
的位置。您会注意到,正态分布在恢复时从rng中提取的数字比未恢复时多。那是因为当你检查的时候它有熵


您必须保存或重置
正常的状态。我建议在检查点过程中调用
normal

这可能只是代码中的一个bug吗?你能做一个独立的、可复制的例子吗(例如,使用字符串流进行序列化)?@KerrekSB我想他没有意识到
normal
有内部状态。事实上,我没有意识到。我想知道Box-Mueller方法成对生成正态随机数是可以理解的。(并不是说Box Mueller一定是实现的,但我想原理是一样的。)谢谢,伙计!这可能只是代码中的一个bug吗?你能做一个独立的、可复制的例子吗(例如,使用字符串流进行序列化)?@KerrekSB我想他没有意识到
normal
有内部状态。事实上,我没有意识到。我想知道Box-Mueller方法成对生成正态随机数是可以理解的。(并不是说Box Mueller一定是实现的,但我想原理是一样的。)谢谢,伙计!我最终只是存储了分发版,而没有调用
reset
。检查点是基于挂钟时间完成的,因此当目标是获得确定性结果(用于调试)时,检查点不应干扰随机数序列。感谢您的快速响应,我开始怀疑我在这个问题上的理智。我最终只是存储分发版,而不是调用
reset
。检查点是基于挂钟时间完成的,因此当目标是获得确定性结果(用于调试)时,检查点不应干扰随机数序列。感谢您的快速回复,我开始怀疑我在这个问题上的理智。
0.727133
0.215537
0.516879
-2.12532
0.314652
1.78136
0.511111
0.83119
0.637067
is >> rng;
is >> <some other stuff>...
0.727133
0.215537
0.516879
0.314652
1.78136
1.28201
0.637067
0.298175
0.802607