【问题标题】:Mathematics behind default_random_engine and normal_distribution in C++C++ 中 default_random_engine 和 normal_distribution 背后的数学
【发布时间】:2013-03-28 03:01:53
【问题描述】:

谁能带我到某个地方,真正谈论支撑这两个 normal_distribution 和 default_random_engine 的数学。据我了解使用梅森捻线机?如果是这样,任何人都可以向我指出一些在线资源的方向,该资源解释了这种伪随机算法的实际工作原理,如果它使用的是它,因为我在 mersenne twister 上找不到太多。此外,如果数字是统一的,大多数伪随机算法输出是,那么 normal_distribution 如何使其呈正态分布?它是否使用逆变换、box muller 或 ziggurat ?任何帮助我都会非常感激:)

【问题讨论】:

  • “因为我在 mersenne twister 上找不到很多东西”——你在哪里看的?因为对我来说,关于这个主题的 wiki 文章是谷歌搜索结果 #2。

标签: c++ math random mersenne-twister


【解决方案1】:

您要问几个问题。第一个涉及生成伪随机数序列的方法,通常是整数。 Wikipedia 对 Mersenne Twister (MT) 和 Linear Congruential Generator (LCG) 进行了合理的描述,两者都执行该功能。这些旨在或多或少地在整个有效范围内均匀分布整数,并代表生成更复杂分布所需的核心功能。

从其他分布生成数字可以通过从生成均匀分布整数伪随机抽取的方法之一中提取数字来执行。有很多方法可以做到这一点:

  1. Inverse Transform Sampling - 如果分布的逆 CDF 具有封闭形式,则可以使用 U(0,1) 的绘制来从底层 PDF 生成绘制。
  2. 身份 - 一些分布可以通过使用其他分布的身份来生成。 normal distribution 属于这一类,因为它的逆 CDF 没有封闭形式。 several methods 可用于从标准正态分布生成绘图。
  3. 用户定义的分布 - 如果没有封闭形式,或者没有合适的身份可用于生成变量,开发人员可以通过抽取样本并创建 PDF 的直方图来近似 PDF。然后可以使用它来构建 CDF 及其逆的近似值,从中可以进行绘制。
  4. Rejection Sampling - 此方法通过拒绝来自不同 PDF 的不符合所需 PDF 属性的绘图来从 PDF 生成变量。

如果您正在寻找 Mersenne Twister 的 C++ 类库的具体实现细节,您可以查看Boost source code,这将提供一些关于 Boost 是如何做到的。 AFAIK,C ++ 11 标准没有指定如何实现,只是它应该如何表现。实现留给编译器开发人员,但如果许多更常见的编译器使用 Boost 实现以外的其他东西,我会感到惊讶(更新:尽管 MSalters 的以下观察是特定编译器执行其他操作的原因之一)。 Boost normal_distribution class 也是如此。

【讨论】:

  • 我相信一些编译器出于法律原因使用非 Boost 实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
相关资源
最近更新 更多