C ++ 11生成随机数的方法是:
问题在于,随机数引擎和随机分布都是根据您使用的算法类型进行模板化的。
这两种算术需要如何相关?
你能为引擎使用32位整数,为发行版使用64位整数吗?有什么危险? 浮点类型怎么样?
我假设一个指导原则,即引擎生成的可能数字的数量应该大于或等于您希望得到的不同随机数的数量。不幸的是,我无法测试我的假设,因为在我的计算机上uint_fast32_t
和uint_fast64_t
是相同的,因此两个C ++ 11生成器中的每一个的建议引擎都会产生相同的结果。
有关std::uniform_real_distribution或std::uniform_int_distribution等C ++ 11发行版的文档在这方面不完整:
此部分不完整。 原因:对发电机的要求
但是,例如gcc 4.7
的{{1}}实现是:
uniform_real_distribution
适配器在哪里:
用于转换任何输出的适配器类 生成器输入特定分布的输入。
“any”听起来令人放心,但它是标准的吗?我特别担心难以发现的隐藏溢出,这可能会影响分发的正确性。
答案 0 :(得分:2)
您可以使用任何统一随机数生成器(URNG)进行任何分配功能。假设分布函数知道它需要什么,并且URNG需要描述它提供的内容,以便分布函数可以为其需求请求足够的熵。 (请注意,“引擎”是URNG,还有一些额外的要求,如可播种性。)
您从GNU标准库实现中提到的“通用”适配器采用统一的随机数生成器G
(实际上它的名称更长,但这将变得乏味)和结果类型R
,必须是数字类型。 G
必须定义G::min
和G::max
,它可以返回的最小值和最大值,并且应该以相等的概率返回这些限制之间的所有值。因此,通过调用G()
可以很容易地知道有多少随机性可用。此外,从numeric_limits<R>
将告诉我们R
需要多少位。因此,将可用熵所需的熵除以告知适配器需要多少次调用G
来生成均匀随机R
。所以适配器接受任何产生一些结果类型的URNG /引擎,并使其适应产生不同的结果类型。