考虑以下最小示例,其中我仅将当前状态写入stdout:
#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。然而,该线程并未回答我的问题。它提到使用相同的语言环境,但似乎并不影响状态。