C++11随机引擎和分布的互动与成本

3

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

  1. Is std::random_device an expensive (heavy constructible) object? Should I only create one for my application if possible?
  2. Are RandomNumberDistribution objects expensive objects or is it mostly dependent of concrete distribution? It seems to me that for example uniform_int_distribution should be very light object containing distribution range [min, max] and may be (?) some internal state.
  3. How does the interaction between random_device, random_engine and distribution work in code below:

    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是否也有一些内部状态呢?

2
请每次提出一个问题,不要一次提出四个问题。 - Lightness Races in Orbit
一些关于 <random> 的轻松阅读材料。 这是一个绝佳的参考,具有出色的示例。 - WhozCraig
3
但这些问题是相关的。 - Pustovalov Dmitry
1个回答

6

1) 通常情况下,初始化过程要么是微不足道的,要么类似于某些伪随机数生成器(PRNG)的初始化方式,然而调用operator()可能需要访问操作系统以获取安全随机数,这可能会非常耗时。

2) 这主要取决于分布。它们包含分布参数(如果需要,您可以检索这些参数),并且可选地包含一些内部状态(据我所知,大多数实现程序都不涉及它)。因此,初始化分布就像初始化小型结构一样。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接