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();
}
适配器在哪里:
一个适配器类,用于将任何 Generator 的输出转换为特定 Distribution 的输入。
“任何”听起来让人放心,但它是标准的吗?我特别担心隐藏的溢出,这些溢出很难检测到,并且可能会影响分布的正确性。