我想将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 (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然而,线程没有回答我的问题。它给出了使用相同地区的提示,但这似乎不会影响状态。
发布于 2017-08-19 11:03:01
因为如何实现类的细节取决于编译器/平台,所以使用STL并不能实现您想要的结果。
如果你想要一个一致的实现,那么我建议你考虑使用Boost。它实现了与STL兼容的所有Random类。(与STL相比,它也有一些优点,比如允许将boost::random::random_device用作种子序列)。虽然Boost是一个可以使用的现有跨平台实现,但您也可以创建自己的类实现。
https://stackoverflow.com/questions/45766536
复制相似问题