c++ - 存储和重新加载随机数生成器状态

标签 c++ random

我正在云中运行大型基因模拟。

通过将虚拟机配置为 preemptible 可以大大降低云资源的成本。 .

为了从抢占中恢复,我在每一代开始时保存我的种群代理的状态,当重新启动时,我加载状态,并从最后完成的一代继续,而不是必须进化每次都从头开始。

这一直运行良好,但现在,出于测试目的,我想要进行可重复的模拟。

我用已知的种子值为我的随机数生成器(目前使用 std::mt19937)播种,这一直有效直到我的虚拟机被抢占。

当我重新加载当前生成时,我需要同时重新加载随机数生成器的状态,以便它也“从它停止的地方开始”。

我发现我可以通过一个紧密的循环运行生成器,丢弃它会生成的所有值,直到我到达我想从中恢复的迭代:

const std::size_t generation = load_state_from_file();

std::mt19937 engine;
engine.seed(constant_seed_value);

// discard the first N generated values
for (std::size_t i = 0; i < generation; ++i)
    engine();

通过紧密循环运行随机数生成器感觉有点难看,如果生成次数非常多,可能会很慢,我想知道是否有更好的方法来做到这一点?

最佳答案

标准库中的 RNG 通过 operator<< and operator>> 内置了对序列化和反序列化的支持。 .

std::mt19937 engine;
engine.seed(constant_seed_value);

// use the engine and then later

output_stream << engine; // save it's internal state to a stream

然后下次我们使用它时,我们将数据加载回去

std::mt19937 engine;
input_stream_with_the_stored_state >> engine;

关于c++ - 存储和重新加载随机数生成器状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59363612/

相关文章:

random - 如何在 Rust 中生成一串具有特定大小的随机 ASCII 可打印字符?

c# - C# 中的随机数生成器问题

javascript - 如何随机化(随机播放)JavaScript 数组?

java - 球的随机开始位置,避免碰撞

Java final 成员数据的 C++ 等价物

c++ - Qt Qvariantlist转换成javascript数组不成功

c++ - 如何告诉TCL和TK在本地搜索默认 `.tcl`语言文件?

c++ - 如何使用 ATL/WTL 制作您自己的类原生(可复制)控件?

mysql - 如何从两个表中随机化sql结果集?

c++ - 如何删除作为 map 值的项目