首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中mt19937的平台相关状态?

C++中mt19937的平台相关状态?
EN

Stack Overflow用户
提问于 2017-08-19 08:24:47
回答 1查看 577关注 0票数 3

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

考虑下面的最小示例,其中我只是将当前状态写入到stdout:

代码语言:javascript
复制
#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)上,我得到:

代码语言:javascript
复制
mt1: 2684129121
mt2: 3957864051
3,598,990,873 2,041,003,246 [...]

在我的Mac (Apple LLVM 8.1.0)上,我得到:

代码语言:javascript
复制
mt1: 2684129121
mt2: 3957864051 
1,413,537,266 1,230,536,264 [...]

基本上,我想了解为什么状态是不同的,以及我如何实现它们是相同的,这样我就可以在系统之间保存和加载状态。

这个问题与这个问题相关:C++ std::mt19937 and rng state save/load & portability然而,线程没有回答我的问题。它给出了使用相同地区的提示,但这似乎不会影响状态。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-19 11:03:01

因为如何实现类的细节取决于编译器/平台,所以使用STL并不能实现您想要的结果。

如果你想要一个一致的实现,那么我建议你考虑使用Boost。它实现了与STL兼容的所有Random类。(与STL相比,它也有一些优点,比如允许将boost::random::random_device用作种子序列)。虽然Boost是一个可以使用的现有跨平台实现,但您也可以创建自己的类实现。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45766536

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档