1. 程式人生 > >概率演算法-均勻分佈產生正態分佈

概率演算法-均勻分佈產生正態分佈

      大部分語言只能產生均勻分佈的隨機數。C語言用(double)rand()/RAND_MAX產生0到1之間均勻分佈的隨機數。那麼如何產生正態分佈的呢?

一般,一種概率分佈,如果其分佈函式為y=F(x),那麼,y的範圍是0~1,求其反函式G,然後產生0到1之間的隨機數作為輸入,那麼輸出的就是

符合該分佈的隨機數了:

     y= G(x)

    以指數分佈為例,假設引數為a,那麼概率密度函式為y=exp(-a);概率分佈函式為y=1-exp(-a)/a。反函式為

y = -ln[(1-y)*a]/a;

MATLAB:

x=rand(1,1000);
a=2;
y=-log((1-x)*a)./a;
hist(y,100)

效果:

但是正態分佈不容易這麼做,因為分佈函式實在有點複雜。

但是正態分佈有一個特殊的性質,就是中心極限定理。其他任意分佈的隨機數,取大量,其均值服從高斯分佈。嚴格的理論是這樣的:

對於服從均勻分佈的隨機變數,只要n充分大,隨機變數 就服從均值為零,方差為1的正態分佈。所以,很簡單,取N個均勻分佈的隨機變數即可。特別的,一般可以取N=12,由於(0,1)均勻分佈的均值為0.5,方差為1/12,因此代入上式,結果為  x1+x2+..+x12-6.程式設計的時候就很方便。

MATLAB:

n=12;
for j=1:5000
    a=rand(1,n);
    u=sum(a);
    x(j)=(u-n*0.5);
end
hist(x,100);

效果:

【3】最後一個辦法,也是最有效的辦法,是Box-Muller方法。正態分佈的另一特殊性質,與瑞利分佈有關。二維正態分佈下,兩個分量如果獨立,那麼他的模服從瑞利分佈。瑞利分佈的話,就可以通過標準的分佈函式求反函式的方法求得。

MATLAB:

N=1000;
x1=rand(1,N);
x2=rand(1,N);
y1=sqrt(-2* log(x1)) .* cos(2*pi.*x2);
y2=sqrt(-2* log(x1)) .* sin(2*pi.*x2);
y=[y1,y2];
hist(y,100);