【问题标题】:What type of random number engine to use with a specified random distribution?什么类型的随机数引擎与指定的随机分布一起使用?
【发布时间】:2013-07-26 03:47:00
【问题描述】:

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

  1. 实例化随机数引擎
  2. 实例化随机分布
  3. 将随机数从引擎推送到分发中

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

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

引擎可以使用 32 位整数,发行版可以使用 64 位整数吗?有什么危险? 浮点类型呢?

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

关于 C++11 发行版(如 std::uniform_real_distributionstd::uniform_int_distribution)的文档在这方面不完整:

此部分不完整。 原因:对生成器的要求

但例如uniform_real_distributiongcc 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 输出的适配器类 生成器到特定分布的输入中。

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

【问题讨论】:

标签: c++ c++11 random


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-11-07
    • 2012-03-10
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2013-04-07
    相关资源
    最近更新 更多