C++ std :: mt19937和rng状态保存/加载和可移植性

Fir*_*cer 12 c++ random serialization

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

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

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

Col*_*nee 5

是的,operator<<并且operator>>是导入或导出随机数生成器状态的唯一方法.如果您愿意,可以轻松地将文本表示转换为二进制文件.

反序列化和序列化mt19937状态应该在实现之间可移植.只要您确保流中充满相同的语言环境,标准就可以很好地定义通过流操作符读取和写入引擎状态的结果.

见第26.5.1.5对于的要求operator<<operator>>,随后§26.5.3.2的文本表示mersenne_twister_engine,这mt19937是一个良好定义的类型定义.