【发布时间】:2018-01-27 17:22:21
【问题描述】:
我想将 std::mt19937 随机数生成器的状态保存在 C++ 程序中,以便我能够在稍后阶段以相同的“随机状态”恢复我的程序。我还想在不同的平台(Linux 和 Mac)上使用我的程序。
考虑以下最小示例,我只是将当前状态写入标准输出:
#include <iostream>
#include <random>
using namespace std;
static mt19937 rng;
int main() {
seed_seq seeder{1234};
rng = mt19937(seeder);
cout << "mt1: " << rng() << endl;
cout << "mt2: " << rng() << endl;
cout.imbue(locale("en_US.UTF-8"));
cout << rng << endl;
}
我的问题是这会为状态生成不同的输出,具体取决于我编译它的平台。在 Linux 系统(g++ 7.1.0)上,我得到:
mt1: 2684129121
mt2: 3957864051
3,598,990,873 2,041,003,246 [...]
在我的 Mac (Apple LLVM 8.1.0) 上,我得到:
mt1: 2684129121
mt2: 3957864051
1,413,537,266 1,230,536,264 [...]
基本上我想了解为什么状态不同以及如何实现它们相同,以便我可以在系统之间保存和加载状态。
这个问题与这个问题有关: C++ std::mt19937 and rng state save/load & portability 但是,该线程没有回答我的问题。它暗示了使用相同的语言环境,但这似乎不会影响状态。
【问题讨论】:
-
我不相信该标准规定了 RNG 状态的确切细节。他们留给实施。您不能在实现之间可移植地传输它。