【问题标题】:c++11 random engines and distributions interaction and costc++11随机引擎和分布交互和成本
【发布时间】:2016-08-09 08:43:17
【问题描述】:

我有一堆关于随机引擎和分布、它们的成本和交互的问题:

  1. std::random_device 是一个昂贵的(重构造的)对象吗?如果可能,我应该只为我的应用创建一个吗?
  2. RandomNumberDistribution 对象是昂贵的对象还是主要依赖于具体的分布?在我看来,例如 uniform_int_distribution 应该是包含分布范围 [min, max] 的非常轻的对象,并且可能是(?)某种内部状态。
  3. random_devicerandom_enginedistribution 之间的交互如何在下面的代码中工作:

    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> distr(1, 10);
    
    auto random_value = distr(gen);
    

最后一行发生了什么?分发从随机引擎获取下一个值,然后将其带到所需的范围[0, 10]?总是很明显,某些对象的内部状态应该在调用后修改:肯定是random_devicerandom_engine,但uniform_int_distribution 是否也有一些内部状态?

【问题讨论】:

  • 每个问题一个问题,请。不是四个。
  • &lt;random&gt; 上进行一些简单的阅读。很好的参考,有很好的例子
  • 但这些问题是相关的

标签: c++ c++11 random


【解决方案1】:

1) 通常不是这样,初始化要么是微不足道的,要么与某些 PRNG 初始化相当,但是调用 operator() 可能会访问操作系统以获得安全的随机数,而且成本可能很高。

2) 主要依赖于分布。它们包含分布参数(如果需要,您可以检索)和可选一些内部状态(IIRC 大多数实现不会打扰它)。所以初始化distribution就像初始化小结构。

3) Distribution 对象调用 generators operator() 未指定次数(从 0 到 ∞ 次)并从 生成的位序列中创建一个随机数发电机。然后它返回生成的 bumber。 它可能会推进 generator 状态,并可能将 generator 生成的未使用位存储在 distribution 内部状态中。

random_device 可能甚至没有内部状态,如果它实现为系统 RNG 的句柄。否则,它的状态会在第二行被推进,当你调用它的operator() 来产生随机数时,你将把它用作生成器的种子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-04
    • 1970-01-01
    • 2013-04-07
    • 2012-12-11
    • 1970-01-01
    • 2013-05-30
    • 2014-12-19
    • 1970-01-01
    相关资源
    最近更新 更多