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

标签 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);
    

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

最佳答案

1) 通常情况并非如此,初始化要么是微不足道的,要么与某些 PRNG 初始化相当,但是调用 operator() 可能会访问 OS 以获得安全的随机数,而且成本可能很高。

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

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

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

关于c++11 随机引擎和分布交互和成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38845975/

相关文章:

c++ - char vs wchar_t vs char16_t vs char32_t (c++11)

c++ - 传递初始化列表或容器,寻找移动语义?

c++ - C++中根据模板类型返回不同类型的对象

c++ - 自定义迭代器的 cbegin 未被使用

algorithm - 从四个整数生成无状态伪随机数

python - 为什么 random.choice 如此不平衡?

javascript - 容器内元素的随机位置

c++ - 更改数组的2行数据

c++ - std::async with std::unique 不编译

c++ - 如何从 IE DOM 获取最新的 IHTMLDocument2 对象