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

标签 c++ serialization random

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

我看到有一个运算符 << 和 >> 重载,它似乎以数字序列的形式保存到字符串中。

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

最佳答案

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

反序列化和序列化 mt19937状态应该在实现之间是可移植的。通过流操作符读取和写入引擎状态的结果由标准明确定义,只要您确保流具有相同的语言环境。

operator<< 的要求见 § 26.5.1.5和 operator>> ,然后是第 26.5.3.2 节,用于 mersenne_twister_engine文本表示 , 其中 mt19937是一个定义良好的 typedef。

关于C++ std::mt19937 和 rng 状态保存/加载和可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27727012/

相关文章:

c++ - 将 vector 堆叠到特征矩阵中

c++ - 仅对 `iluInit' 的 undefined reference

ruby-on-rails - 使用 active_model_serializers 将方法应用于所有属性

java - 将序列化 java 对象保存到 Db 时出现问题

java - 如何随机生成 1 到 50 之间的整数 (java)

c++ - 为什么流量生成器工具使用 libpcap 库?

c++ - 平衡括号 - 堆栈未被识别为空

c# - 将 XML 文件反序列化为 .Net 对象

javascript - 随机播放声音重叠

sql-server - 使用 LINQ(ala TABLESAMPLE)从大型结果集中有效地选择随机行