gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 01:13:54 25 4
gpt4 key购买 nike

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

通过将虚拟机配置为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com