数学背后是default_random_engine和C++中的normal_distribution

Rob*_*cer 2 c++ random math mersenne-twister

任何人都可以带我到某个实际上谈论支撑这两个normal_distribution和default_random_engine的数学的地方.据我所知,使用梅森捻线机?如果是这样,任何人都可以指向我的一些在线资源的方向,解释这个伪随机算法实际上如何工作,如果它是它使用的,因为我不能找到很多关于mersenne twister.此外,如果数字是统一的,大多数伪随机算法输出的是,那么normal_distribution如何使其正常分布?它可能使用逆变换,盒子研磨器或者ziggurat吗?任何帮助,我真的很感激:)

and*_*and 5

你问的问题有几个.第一个问题是生成伪随机数序列的方法,通常是整数.维基百科对Mersenne Twister(MT)以及线性同余生成器(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观察是特定编译器会做其他事情的原因之一).这同样适用于在升压normal_distribution类.