【问题标题】:Mersenne Twister Reproducibility across Compilers [duplicate]Mersenne Twister 跨编译器的可重复性 [重复]
【发布时间】:2015-02-14 00:55:32
【问题描述】:

我正在使用 std::mt19937_64 生成一个随机数序列。我注意到,当使用 GCC 和 Clang 在同一平台上使用相同的种子运行时,我获得了不同的序列。我通过 Valgrind 运行了程序,没有发现未初始化的内存。

使用 std::mt19937_64 是否可以保证跨编译器或跨平台的再现性?

编辑:使用 std::normal_distribution 运行

【问题讨论】:

  • 如果您需要交叉编译器保证兼容性,您可以使用Boost.Random
  • 也许我在这里有点天真,但可以说如果他们使用相同的算法和相同的参数,他们不应该重现相同的序列吗?
  • 由于您使用的是正态分布,请参阅我的answer here 基本上答案是否定的,但底层引擎应该是一致的,看起来像重复。

标签: c++ random c++-standard-library


【解决方案1】:

引擎生成的数字保证在不同的实现中是可重现的,但分布却不是。 (来源:rand() considered harmful)。

N3337 标准草案中提到了 normal_distribution (26.5.8.5.1):

一个 normal_distribution 随机数分布产生根据概率密度函数分布的随机数 x

分布参数 µ 和 σ 也称为该分布的均值和标准差

然后……就是这样。它没有指定生成数字的顺序,也没有算法,也没有示例输出。

标准对mersenne_twister_engine(26.5.3.2)做了很详细的规定,规定了状态转移函数、初始播种算法等。

【讨论】:

  • 这是由于函数处理种子的方式不同造成的吗?
  • 等式是错误的。我认为您选择了错误的链接。
  • @Mr.Llama 我对此表示怀疑。该标准非常详细说明了播种应该如何工作。
  • @rubenvb 你是对的。这是我的错,我不小心发了gamma_distribution。我会马上解决的。
猜你喜欢
  • 2013-01-22
  • 2014-02-22
  • 2014-03-01
  • 2010-12-19
  • 2014-04-17
  • 1970-01-01
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
相关资源
最近更新 更多