一、题目
利用第二次作业撰写的均匀随机数生成器,生成第一次作业中拟合的随机分布,并完成其分布检验。
二、任务目标
第一次作业我们通过调查问卷的形式,统计了学生们起床时间点和起床耗时时间,然后做了分布拟合。对于起床时间点(不分男女),其分布大致符合
1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|
6:30以前 | 6:30-6:40 | 6:40-6:50 | 6:50-7:00 | 7:00-7:10 | 7:10-7:20 | 7:20-7:30 |
8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|
7:30-7:40 | 7:40-7:50 | 7:50-8:00 | 8:00-8:10 | 8:10-8:20 | 8:20-8:30 |
同时,第二次作业我们通过CMRG生成器生成了均匀分布的随机数,现在我们将利用CMRG生成器,通过Box Muller 法生成服从
三、生成随机数
1、生成两组独立的均匀分布随机变量
在上次作业中我们已经通过CMRG生成器
完成了均匀分布随机数的生成并通过了检验。在Box Muller 法中,我们需要两组独立的均匀分布随机变量,通过置不同的初始值达到以上目的,代码如下:
%生成随机数的个数
N = 100000*3;
%m1,m2
m1=2.^32-209;m2=2.^32-22853;
%z1系数
a1=1403580;a2=810728;
%z2系数
b1=527612;b2=1370589;
%u1
z11=2637242579;z12=1747669293;z13=2112977067;
z21=2633436652;z22=3518603782;z23=229738972;
u1=zeros(1,N);
for i=1:N
z1_i=mod(a1*z12-a2*z11,m1);
z2_i=mod(b1*z22-b2*z21,m2);
y=mod(z1_i-z2_i,m1);
z11=z12;
z12=z13;
z13=z1_i;
z21=z22;
z22=z23;
z23=z2_i;
u1(1,i)=y./m1;
end
%u2
z11=2000296842;z12=2952722757;z13=1488858363;
z21=1878479796;z22=3478083987;z23=3429948804;
u2=zeros(1,N);
for i=1:N
z1_i=mod(a1*z12-a2*z11,m1);
z2_i=mod(b1*z22-b2*z21,m2);
y=mod(z1_i-z2_i,m1);
z11=z12;
z12=z13;
z13=z1_i;
z21=z22;
z22=z23;
z23=z2_i;
u2(1,i)=y./m1;
end
2、Box Muller法生成正态分布随机变量
因分布函数在极坐标下有封闭形式,可采用反变换法,其在极坐标下的反函数形式如下:
%生成正态分布随机变量xnorm
mu = 7.11321;
sigma = 2.30661;
r = sqrt(-2*log(u2));
theta = 2*pi*u1;
x = r.*cos(theta);
xnorm = repmat(mu, 1, N) + sigma*x;
figure
hold on;
histogram(xnorm,100,'Normalization','pdf')
%正态分布曲线
x=-2:.01:18;
norm=normpdf(x,7.11321,2.30661);
plot(x,norm)
生成的随机变量pdf如下,和正态分布曲线基本拟合。
四、分布检验
1、K-S检验
kstest =
'kstest pass'
2、Q-Q图检验
生成的正态分布分位数与正态分布的分位数为明显线性关系,表明生成的随机变量符合正态分布。
3、检验部分代码
%K-S检验
pd = makedist('normal','mu',mu,'sigma',sigma);
h=kstest(xnorm,pd);
if h
kstest='kstest fail'
else
kstest='kstest pass'
end
%pdf检验
%Q-Q图
figure(1)
subplot(1,2,1)
hist(xnorm,100)
subplot(1,2,2)
qqplot(xnorm)
subplot(1,2,3)
五、总结
通过Box Muller法生成的正态分布随机变量符合正态分布。另外,生成的随机变量可通过文章开始的表格进行映射,最终得到的起床时间点为整数部分映射的开始时间+小数部分*10(分钟),如抽样一个随机变量为7.25,其对应起床时间为7:20+0.25 X 10 = 7:22分30秒。