mt19937在C ++中依赖于平台的状态?

我想将std :: mt19937随机数发生器的状态保存在一个C ++程序中,这样我就可以在稍后的阶段以相同的“随机状态”恢复我的程序。 我也想在不同的平台(Linux和Mac)上使用我的程序。

考虑下面的最简单的例子,我简单地把当前状态写入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(苹果LLVM 8.1.0),我得到:

 mt1: 2684129121 mt2: 3957864051 1,413,537,266 1,230,536,264 [...] 

基本上我想明白为什么国家是不同的,我怎样才能实现它们是相同的,这样我就可以在系统之间保存和加载状态。

这个问题是关系到这一个: C + + std :: mt19937和rng状态保存/加载和可移植性但是,线程不回答我的问题。 它提供了使用相同的语言环境的提示,但是这似乎不影响状态。

因为类的具体实现取决于编译器/平台,所以你真的不会达到你想要的STL。

如果你想要一个一致的实现,那么我建议看看使用Boost。 它具有STL兼容的所有随机类的实现。 (它也比STL有一些优点,例如允许boost::random::random_device被用作种子序列)。 您也可以自行实现该类,不过Boost是可以使用的现有的跨平台实现。