7

C++11生成随机数的方式是:

  1. 实例化一个随机数引擎
  2. 实例化随机分布
  3. 通过分布从引擎推送随机数

问题是随机数引擎随机分布都根据您使用的算术类型进行了模板化。

这两种类型的算术需要如何关联?

你可以使用 32 位整数作为引擎,使用 64 位整数作为分布和相反的值吗?有什么危险?浮点类型呢?

我假设一个准则,即引擎生成的可能数字的数量应该大于或等于您希望获得的不同随机数的数量。不幸的是,我无法检验我的假设,因为在我的计算机上uint_fast32_tuint_fast64_t是相同的,因此三个 C++11 生成器中的每一个的两个建议引擎都会产生相同的结果。

在这方面,关于std::uniform_real_distributionstd::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 的输入。

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

4

1 回答 1

2

您可以对任何分布函数使用任何统一随机数生成器 (URNG)。假设分布函数知道它需要什么,并且要求 URNG 描述它提供什么,以便分布函数可以请求足够的熵来满足它的需要。(请注意,“引擎”是 URNG,还有一些额外的要求,例如可播种性。)

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

于 2013-07-26T03:24:56.000 回答