组里的同事突然问我如何生成服从高斯的随机生成器。

想当然的就感觉给定高斯函数,然后利用rand()的均匀分布产生的随机数,来模拟。

总感觉有点问题。


然后调查了一番,感觉还是有点东西需要记录,算是再学习吧。

1) 按照中心极限定理,对于独立同分布的随机变量之和逼近于正态分布。

这样就可以用rand()生成的随机数,有限次相加就可以逼近正态分布了。

加上平均值和偏差也就可以模拟服从高斯分布的随机数了。

 

2)由于上述需要多次相加,计算量比较大。由此有另外一种方法就是

使用Box-Muller Transformation.

将两个独立生成的服从均匀分布的随机数U1,U2(0,1之间)。进行如下转换

[Math]服从高斯分布的随机生成器

[Math]服从高斯分布的随机生成器

即服从两个独立的正态分布。

u,v为极坐标,s为平方和开根号(半径)

s与U1对应,[Math]服从高斯分布的随机生成器与U2对应。

 

为啥经过这个变化就可以直接得到服从正态分布的数呢。

根据Marsaglia polar method

If u is uniformly distributed in the interval 0 ≤ u < 1, 
then the point (cos(2πu), sin(2πu)) is uniformly distributed on the unit circumference x2 + y2 = 1,
and multiplying that point by an independent random variable ρ whose distribution is

[Math]服从高斯分布的随机生成器

will produce a point

[Math]服从高斯分布的随机生成器

whose coordinates are jointly distributed as two independent standard normal random variables.

此处的u即为上述的服从均匀分布的U2

而rho,正好是上述U1的chi-2距离。正好服从上述分布

[Math]服从高斯分布的随机生成器

那么就说明,产生的两个点z0,z1服从独立的正态分布。

 

而至于Marsaglia polar method方法的证明,我没有直接找到。

经过一些相关的资料,可以发现,使用Inverse transform sampling的概念,

生成点函数的反函数的Jacobian行列式为高斯密度函数,可以推导出此函数即服从于高斯分布。

(可能理解还有偏差,如有不对请高人指点)

具体证明请参照下一篇续-修改@2010.11.2

相关文章: