我希望能够保存并加载RNG的状态,这样我就可以从给定的点(应用程序保存/快照)重现相同的随机值。
我看到有一个运算符<<和>>重载,似乎将字符串保存为数字序列。
答案 0 :(得分:5)
是的,operator<<
和operator>>
是导入或导出随机数生成器状态的唯一方法。如果您愿意,可以轻松地将文本表示转换为二进制文件。
反序列化和序列化mt19937
状态应在实现之间可移植。通过流操作符读取和写入引擎状态的结果由标准明确定义,只要您确保流中充满了相同的语言环境。
有关operator<<
和operator>>
的要求,请参见§26.5.1.5,然后是mersenne_twister_engine
的文本表示的§26.5.3.2,{ {1}}是一个定义良好的typedef。
答案 1 :(得分:0)
在上一个答案的基础上:
通过op&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;如果通过op&gt;&gt;回读它将只保存适当的RNG状态使用相同的区域设置。更改区域设置将导致问题
default_random_engine
的选择是实现定义的。它是一个typedef,但允许在不同平台上设置为不同的真实引擎(第26.5.5节)。因此,使用op&lt;&lt;和op&gt;&gt;保存/恢复状态几乎禁止使用默认引擎
虽然生成器的指定非常严格,但我不认为平台之间的分布必须相同。保存状态可能对这里的再现性没有多大帮助
我建议将此文档放在手边,以防http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4296.pdf