我正在云中运行大型基因模拟。
通过将虚拟机配置为 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/