c++11随机引擎与发行版的交互与成本

c++11 random engines and distributions interaction and cost

本文关键字:交互 随机 引擎 c++11      更新时间:2023-10-16

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

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

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

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

1)通常不是这样,初始化要么微不足道,要么与一些PRNG初始化相当,但是调用operator()可能会访问OS以获得安全随机数,并且可能代价高昂。

2)主要取决于分布。它们包含分布参数(如果需要可以检索)和可选的一些内部状态(IIRC的大多数实现都不会为此烦恼)。所以初始化分布就像初始化一个小结构。

3) Distribution对象调用生成器 operator()不指定次数(从0到∞次),并从生成器产生的位序列中生成一个随机数。然后它返回生成的数字。它可能会推进生成器状态,并可能将生成器产生的未使用的比特存储在分布内部状态中。

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