我有很多关于随机引擎和分布、它们的成本和交互的问题:
- Is
std::random_device
一个昂贵的(重型可建造的)物体?如果可能的话,我应该只为我的应用程序创建一个吗?
- Are
RandomNumberDistribution
对象是昂贵的对象还是主要取决于具体的分布?在我看来,例如uniform_int_distribution
应该是包含分布范围的非常轻的物体[min, max]
并且可能是(?)某种内部状态。
-
之间如何相互作用random_device
, random_engine
and distribution
在下面的代码中工作:
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()
可能会访问操作系统以获取安全随机数,这可能会很昂贵。
2)主要取决于分配。它们包含分布参数(如果需要,您可以检索这些参数)和可选地一些内部状态(IIRC 大多数实现并不关心它)。所以初始化分配就像初始化小结构一样。
3) 分配对象调用发电机 operator()
未指定的次数(从 0 到 Infini 次),并从由产生的位序列创建一个随机数发电机。然后它返回生成的bumber。
它可能会进步发电机状态并可能存储由产生的未使用的位发电机 in 分配内部状态。
random_device
如果它实现为系统 RNG 的句柄,则可能甚至没有内部状态。否则,当您调用它时,它的状态会在第二行提前operator()
产生随机数,您将用作您的种子发电机.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)