2

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

4

1 回答 1

5

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

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

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

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

于 2013-03-28T04:19:28.383 回答