【问题标题】:Can C++11 PRNG be used to produce repeatable results?C++11 PRNG 可以用来产生可重复的结果吗?
【发布时间】:2016-04-30 16:59:31
【问题描述】:

我正在为我的包开发一个测试套件,作为测试的一部分,我想在一个数据块上运行我的算法。然而,我突然想到,我可以使用一种算法来生成它,而不是硬编码一个特定的数据块。我想知道 C++11 <random> 设施是否适合此目的。

据我了解,实现特定算法需要 C++11 随机数引擎。因此,给定相同的种子,它们应该在算法参数定义的范围内产生相同的随机整数序列。

但是,就发行版而言,该标准规定:

生成每个指定分布的算法是实现定义的。

(26.5.8.1 随机数分布类模板/一般)

这——除非我弄错了——意味着分布的输出几乎是未定义的。根据我的测试,GNU libstdc++ 和 LLVM 项目的 libc++ 中的分布在相同的随机引擎下会产生不同的结果。

因此,问题是:产生可在不同平台上完全重复的伪随机数据的最正确方法是什么?

【问题讨论】:

  • 这意味着您要么直接使用 RNG,要么使用可移植的发行版。既然不是标准的,你就必须使用非标准的(手写的或第三方的)
  • 可以使用SHA等哈希和

标签: c++ c++11 random


【解决方案1】:

产生可在不同平台上完全重复的伪随机数据的最正确方法是什么?

这很明显:编写您自己的发行版。正如您自己指出的那样,引擎 是跨平台的,因为它们实现了特定的算法。它是实现定义的分布。

所以自己编写分布。

【讨论】:

    【解决方案2】:

    请看这个答案:https://stackoverflow.com/a/34962942/1151329

    我确实遇到了这个问题,编写自己的发行版效果很好。我在 linux、OSx、windows、x86 和 ARM 上得到了相同的序列。

    【讨论】:

      猜你喜欢
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-09
      • 2020-07-09
      • 1970-01-01
      • 2010-12-10
      • 1970-01-01
      相关资源
      最近更新 更多