【问题标题】:Does the C++11 standard guarantee identical random numbers for the same seed across implementations?C++11 标准是否保证跨实现的相同种子具有相同的随机数?
【发布时间】:2012-11-27 16:58:33
【问题描述】:

例如,如果我在 GCC 和 MSVC 下使用完全相同的种子和参数实例化 std::mt19937,我应该得到相同的随机数序列吗?如果是这样,我假设这个属性通常适用于 mersenne_twister_engine,因为 mt19937 只是具有特定参数的一个。这不适用于 C 中的 rand()。看起来标准记录了针对特定代码应用的转换,所以我怀疑它应该总是相同的,但魔鬼在细节中......

【问题讨论】:

  • rand 的不同实现使用不同的常量,因此它们永远不会匹配。维基百科包含一个方便的列表:en.wikipedia.org/wiki/…
  • @MarkRansom:允许不同的实现对 rand() 使用完全不同的算法,常量除外。
  • “允许使用”,当然。在实践中,它们似乎都是一样的。

标签: c++ random c++11 standards


【解决方案1】:

对于新的随机数引擎,是的,对于相同的种子和参数,您将在所有平台上获得相同的值序列。对于rand(),没有。你也没有随机数分布的保证,即使它们被输入相同的输入值序列。

【讨论】:

  • 此外,发行版也不能保证产生相同的值,因此将引擎与发行版结合起来不会在平台之间产生相同的结果。
  • C 标准,7.22.2.2/2 "srand 函数使用参数作为新的伪随机数序列的种子,这些伪随机数序列将由后续调用 rand 返回。如果 srand 被调用相同的种子值,则应重复伪随机数序列。如果在对 srand 进行任何调用之前调用了 rand,则应生成与第一次调用 srand 时相同的序列,种子值为 1。那怎么不保证呢?
  • @rici - 每个实现的rand() 版本都需要在给定相同种子的情况下生成相同的序列,但不要求不同的实现生成相同的序列。
  • @JosephGarvin - 需求是分布式的:每个引擎描述它使用的算法,并且,对于一组特定的参数,给出第 10,000 个值(便于检查实现是否正确)。
  • 皮特,啊,真的,算法没有定义。 @JosephGarvin,Mersenne twister 算法(以及其他一些伪随机算法)在 C++ 标准中的第 26.5.3 节(Mersenne twister 的 26.5.3.2)中有详细定义。
猜你喜欢
  • 2011-06-13
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 2016-09-20
  • 1970-01-01
  • 2019-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多