【问题标题】:Platform dependent state of mt19937 in C++?C++ 中 mt19937 的平台相关状态?
【发布时间】: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 状态的确切细节。他们留给实施。您不能在实现之间可移植地传输它。

标签: c++ linux macos random


【解决方案1】:

因为如何实现类的具体细节取决于编译器/平台,所以您真的无法通过 STL 实现您想要的。

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

【讨论】:

  • 谢谢。似乎唯一的选择是使用另一个库。
猜你喜欢
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 2015-02-27
  • 2011-03-17
  • 2014-12-26
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
相关资源
最近更新 更多