【发布时间】:2013-07-26 03:47:00
【问题描述】:
C++11产生随机数的方式是:
- 实例化随机数引擎
- 实例化随机分布
- 将随机数从引擎推送到分发中
问题在于,随机数引擎和随机分布都根据您使用的算术类型进行了模板化。
这两种算术需要如何关联?
引擎可以使用 32 位整数,发行版可以使用 64 位整数吗?有什么危险? 浮点类型呢?
我假设一个准则是,引擎生成的可能数字的数量应该大于或等于您希望获得的不同随机数的数量。不幸的是,我无法检验我的假设,因为在我的计算机上 uint_fast32_t 和 uint_fast64_t 是相同的,因此三个 C++11 生成器中的每一个的两个建议引擎都会产生相同的结果。
关于 C++11 发行版(如 std::uniform_real_distribution 或 std::uniform_int_distribution)的文档在这方面不完整:
此部分不完整。 原因:对生成器的要求
但例如uniform_real_distribution 的gcc 4.7 实现是:
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();
}
适配器在哪里:
用于转换 any 输出的适配器类 生成器到特定分布的输入中。
“任何” 听起来让人放心,但它是标准的吗?我特别担心隐藏的溢出,这些溢出很难检测到,可能会影响分布的正确性。
【问题讨论】:
-
要求可以在open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf(第904页起)中找到。我找不到答案,但也许你可以?