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实施uniform_real_distribution是:
template<typename _UniformRandomNumberGenerator>
result_type
operator()(_UniformRandomNumberGenerator& __urng,
const param_type& __p)
{
__detail::_Adaptor<_UniformRandomNumberGenerator, result_type>
__aurng(__urng);
return (__aurng() * (__p.b() - __p.a())) + __p.a();
}
Run Code Online (Sandbox Code Playgroud)
适配器的位置是:
一个适配器类,用于将任何 Generator 的输出转换为特定分发的输入.
该"任何"听起来让人放心,但它是标准?我特别担心难以检测到的隐藏溢出,这可能会影响分发的正确性.
您可以对任何分布函数使用任何统一随机数生成器 (URNG)。假设分布函数知道它需要什么,并且 URNG 需要描述它提供什么,以便分布函数可以为其需要请求足够的熵。(请注意,“引擎”是 URNG,具有一些附加要求,例如可播种性。)
您在 GNU 标准库实现中提到的“通用”适配器采用统一的随机数生成器G(实际上它的名称要长得多,但这会变得乏味)和结果类型R(必须是数字类型)。G必须定义G::min和G::max,它可以返回的最小值和最大值,并且应该以相同的概率返回这些限制之间的所有值。因此,很容易知道调用 时有多少位随机性可用G()。此外,fromnumeric_limits<R>会告诉我们一个R. 因此,将所需的熵除以可用的熵可以告诉适配器需要调用多少次才能G产生均匀随机的R. 因此,适配器采用任何产生某种结果类型的 URNG/引擎,并对其进行调整以产生不同的结果类型。