正态分布随机数产生方法

时间:2024-11-10 20:53:22

1、舍选法

参考:如何产生指定分布的随机数?——>舍选法

2、利用中心极限定理

X1,X2,,Xn X 1 , X 2 , ⋯ , X n 为独立同分布的随机变量序列,均值为 μ μ ,方差为 σ2,则

Zn=X1+X2++Xnnμσn Z n = X 1 + X 2 + ⋯ + X n − n μ σ n

具有渐近分布 N(0,1) N ( 0 , 1 ) ,也就是说当 n n → ∞ 时,

P{X1+X2++Xnnμσnx}12πxet22dt P { X 1 + X 2 + ⋯ + X n − n μ σ n ≤ x } → 1 2 π ∫ − ∞ x e − t 2 2 d t

换句话说,n 个相互独立同分布的随机变量之和的分布近似于正态分布,n 越大,近似程度越好。

根据中心极限定理,生成正态分布就非常简单粗暴了,直接生成n个独立同分布的均匀分布即可。
程序:

clear all
n=unifrnd ( 0,1,200000,1);
N=50;
w=zeros(1,4000);
w(1)=0;
   for t=1:4000;
       for j=1:N;
           w(t)=w(t)+n((j-1)*4000+t);
       end
   end       
figure(1);
hist(w,400);

结果:

3、Box–Muller算法

当x和y是两个独立且服从(0,1)均匀分布的随机变量时,则

Z1=cos(2πx)2ln(1y) Z 1 = cos ⁡ ( 2 π x ) ⋅ – 2 ln ⁡ ( 1 – y )
Z2=sin(2πx)2ln(1y) Z 2 = sin ⁡ ( 2 π x ) ⋅ – 2 ln ⁡ ( 1 – y )

Z0 Z 0 Z1 Z 1 独立且服从标准正态分布。

程序:

clear all;clc;%清屏 
m=input('请输入平均值:');
n=input('请输入标准差:'); 
t=input('请输入数据长度:'); %产生正态分布的随机数 
for i=1:t    
    a=rand;     
    b=rand;     
    X1(i)=sqrt((-2)*log(a))*cos(2*pi*b);    
    X2(i)=sqrt((-2)*log(a))*sin(2*pi*b);   
    Y1=X1*n+m;    
    Y2=X2*n+m; 
end
% 求平均值和标准差
M1=mean(Y1); N1=std(Y1);
M2=mean(Y2); N2=std(Y2); 

输入:平均值:5;标准差:1;数据长度:100
结果:
这里写图片描述
输入:平均值:5;标准差:1;数据长度:10000
结果:
这里写图片描述

参考:/baimafujinji/article/details/6492982?locationNum=6
/2015/06/generating-normal-distr-variates