使用什么类型的随机数生成器来配合指定的随机分布?

7
C++11生成随机数的方法是:
  1. 实例化一个随机数引擎
  2. 实例化一个随机分布
  3. 通过分布将随机数从引擎中推送出来
问题在于,随机数引擎和随机分布都是根据你使用的算术类型进行模板化的。 这两种算术类型需要如何相关联? 可以将32位整数用于引擎,将64位整数用于分布,反之亦然吗?有什么危险性? 浮点数类型呢?
我假设一条指导原则:引擎生成的可能数字数量应大于或等于您希望获得的不同随机数字的数量。不幸的是,由于在我的计算机上,uint_fast32_tuint_fast64_t相同,因此每个C++11生成器的建议引擎都会产生相同的结果,无法测试我的假设。

关于 C++11 分布函数,如 std::uniform_real_distributionstd::uniform_int_distribution 的文档在这方面是不完整的:

本节不完整。 原因:生成器的要求

但例如 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();
}

适配器的位置:

适配器类,用于将任何生成器的输出转换为特定分布的输入。

"任何"听起来很令人放心,但它是否标准?我特别担心难以检测到的隐藏溢出,这可能会影响分布的正确性。


1
要求可以在 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3242.pdf(从第904页开始)中找到。我找不到答案,也许你可以? - Escualo
1个回答

2

您可以使用任何统一随机数生成器(URNG)生成任何分布函数。分布函数假定知道它所需的内容,而URNG需要描述它提供的内容,以便分布函数可以请求足够的熵来满足其需求。(请注意,“引擎”是一个URNG,还有一些额外的要求,如可种子性。)

您提到的GNU标准库实现中的“通用”适配器接受一个统一随机数生成器G(实际上它的名称更长,但那会变得乏味)和一个结果类型R,必须是数字类型。G必须定义G::minG::max,它可以返回的最小和最大值,并且应该以相等的概率返回这些限制之间的所有值。因此,可以很容易地知道从调用G()中有多少个比特的随机性可用。此外,从numeric_limits<R>将告诉我们需要多少位来表示R。因此,将所需的熵除以可用的熵告诉适配器需要调用G多少次才能产生均匀随机的R。因此,适配器接受任何生成某个结果类型的URNG/引擎,并使其适应生成不同的结果类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接