c ++ 11随机引擎和分布交互和成本

时间:2016-08-09 08:43:18

标签: c++ c++11 random

我有很多关于随机引擎和发行版,成本和互动的问题:

  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);
    
  4. 最后一行会发生什么?分布从随机引擎获得下一个值,然后将其带到期望的范围[0, 10]?总是显然在调用之后应修改某些对象的内部状态:绝对random_devicerandom_engineuniform_int_distribution是否也有一些内部状态?

1 个答案:

答案 0 :(得分:4)

1)通常它不是,初始化对于某些PRNG初始化来说是微不足道的或可共同的,但是调用operator()可能会访问操作系统以获得安全的随机数,这可能是昂贵的。

2)主要取决于发行。它们包含分发参数(如果需要可以检索)和可选某些内部状态(IIRC大部分实现都不会打扰它)。因此初始化分发就像初始化小结构一样。

3)分发对象调用生成器 operator()未指定的次数(从0到∞次)并根据<生成的位序列创建一个随机数EM>发电机。然后它返回生成的bumber。 它可能会提升 generator 状态,并可能在 distribution 内部状态中存储 generator 生成的未使用位。

如果它实现为系统RNG的句柄,那么

random_device可能甚至没有内部状态。否则,当您调用其operator()以生成随机数时,其状态在第二行上前进,您将用作生成器的种子