C ++ std :: mt19937和rng state save / load&可移植性

时间:2014-12-31 22:47:32

标签: c++ serialization random

我希望能够保存并加载RNG的状态,这样我就可以从给定的点(应用程序保存/快照)重现相同的随机值。

我看到有一个运算符<<和>>重载,似乎将字符串保存为数字序列。

  • 这是保存的最好/唯一方法吗?我不介意只有固定大小的二进制状态值而不是这个空格分隔的字符串,然后我需要为我的文件格式添加前缀或分隔符。
  • 这是否便携?例如我可以在不同的编译器版本之间,甚至在MSVC和GCC之间传输它,以便在给定相同配置的分布的情况下生成相同的数据集(在浮点的情况下为一小部分误差,对整数数学来说是精确的)?

2 个答案:

答案 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