c++11随机引擎与发行版的交互与成本
c++11 random engines and distributions interaction and cost
我有一堆关于随机引擎和分布,它们的成本和交互的问题:
-
std::random_device
是一个昂贵的(重构造)对象吗?如果可能的话,我应该只为我的应用程序创建一个吗? -
RandomNumberDistribution
对象是昂贵的对象还是主要依赖于具体分布?在我看来,例如uniform_int_distribution
应该是包含分布范围[min, max]
的非常轻的对象,并且可能是(?)某些内部状态。 -
random_device
,random_engine
和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()
可能会访问OS以获得安全随机数,并且可能代价高昂。
2)主要取决于分布。它们包含分布参数(如果需要可以检索)和可选的一些内部状态(IIRC的大多数实现都不会为此烦恼)。所以初始化分布就像初始化一个小结构。
3) Distribution对象调用生成器 operator()
不指定次数(从0到∞次),并从生成器产生的位序列中生成一个随机数。然后它返回生成的数字。它可能会推进生成器状态,并可能将生成器产生的未使用的比特存储在分布内部状态中。
random_device
,可能,甚至没有内部状态,如果它被实现为系统RNG的句柄。否则,它的状态在第二行被提升,当您调用它的operator()
来产生随机数时,您将使用它作为生成器的种子。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- Qt VTK交互风格的信号到小部件
- 为什么 Serial.println(<char[]>);返回随机字符?
- 字符串-C++后显示的随机字符
- 循环中的随机函数
- 在c++构造函数中使用随机字符串生成器
- 使用std::mt19937从字符串中返回一个随机单词
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- 如何在C++中高效地构造随机骰子
- Qt Quick-如何仅从c++代码与qml属性交互
- 在类中使用随机生成器时出现性能问题
- 在将数字随机生成为数组期间从内存输出随机数的数组
- 将字符随机转换为大写的函数
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 复制和交换习惯用法与移动操作之间的交互
- 如何生成一个随机的 n 位数,其中 n 是任意的
- 将随机生成的数字添加到数组 + 对这些数组求平均值
- 如何使用要传递给 mt19937 的可选随机种子参数设计函数
- 在C++中随机生成 20 个非重复数字
- c++11随机引擎与发行版的交互与成本