我需要在C ++ 11中实现我自己的随机数分发类,但是我找不到简单的实现来让我开始。
我已经搜索了gcc源代码,但只找到了头文件而不是不同非均匀分布的实现。
您能否指出一个简单而完整的C ++ 11中非均匀分布类的示例,或者在此处发布一个?
答案 0 :(得分:4)
你错了。 Luc Devroye在这个主题上写了800 page book。没有一种技术适用于所有发行版。有4种一般方法:我想实现你自己的发行版并不是太奇特了......
反演 - 如果累积分布函数F X (b), - ∞< b< ∞,是一个连续的可逆函数,然后F X (X),CDF应用于它自己的随机变量,具有均匀(0,1)分布。等于F X (X)= U并求解X(如果可能的话)。
卷积 - 求和或差分随机变量会产生新的分布。例如,两件制服的总和呈三角形分布;或者,n个独立卡方(1)的总和产生卡方(n)
组合 - 可以使用条件概率从更简单的分布中逐步建立一些复杂的分布。
技巧/特殊关系 - 利用不同分布之间的独特关系,例如标准法线的平方是卡方(1)随机变量的事实;或者卡方(2)与指数(2)相同。与毕达哥拉斯一起,这两个事实是Box-Muller生成法线的方法的核心。将两个独立的标准法线绘制在一起,得到一个来自(0,0)的2-d向量,该向量以均匀(0,2π)方向前进,长度为sqrt(exponential(2))
。生成这样的矢量并使用正弦和余弦变换将其转换回笛卡尔坐标,以产生两个独立的法线。
Devroye的书中填写了许多“流行”分布的细节,但由于有无数的分布,因此无法进行详尽的处理。
本tutorial paper第59页第4.3节对上面概述的四种技术中的每种技术都有一个有效的例子,并在第60-62页上提供了反演证明。