随机过程与随机信号处理课程作业
——对均匀分布和正态分布的模拟
随机数的在信息安全和通信系统以及其他现代系统中都有很重要的应用。
但是在计算机上产生“真正”的随机数是不可能的,因为计算机所有的算法都是有程序来控制的,程序都是通过数学表达式来完成的。
因此通常人们都是将计算机上产生的随机数称为“伪随机数”。
本实验即是通过程序来模拟产生均匀分布的数据,并检验下是否符合真正的随机均匀分布的一些统计特性。
产生的数列必须符合统计特性才能具有使用价值。
其他常用的随机分布在计算机中,都可以通过均匀分布得到[3][4][5]。
实验在后面将通过均匀分布得到正态分布。
一、计算机产生伪均匀分布数据的算法
常用的伪均匀分布产生的数学算法有取中法,移位法和同余法。
具体见参考资料,这些算法都是具有各自的特点。
参考资料1比较了几种算法,得出了其中比较好的算法是同余法,而其中最好的算法是混合同余法和乘同余法[1]。
所以本实验采用乘同余法实现均匀分布的模拟。
下面简单介绍下乘同余法的数学表达。
[0,1]区间上的均匀分布是连续型分布,它表示随机变量取[0 ,1]区间上任何一个小区间内的点的概率等于该区间的长度。
产生[0 ,1]区间上随机数的递推公式如下:
10
()m od /n n n n x ax M
r x M
x -=⎧⎪
=⎨⎪
⎩初值 (1.1) 其中M 为模数,a 为乘子,0x 为初始值,其应小于M 。
n r 即为所产生的均匀分布数列。
从上述公式可以看出,要想产生符合均匀分布的数列,而不是一个周期性的数列,模数的取值必须大,这样才能不重复出现相同的余数。
这里给出文献中给出的参数,也是一般性软件中常用的参数:
35231
3125
M a ⎧=-⎨
=⎩ (1.2) 其中初始值0x 可以取任意小于M 的正整数[2]。
二、实验模拟
在MATLAB 中对上述数学表达式进了编程,代码如下: clear; clc;
x(1)=100; N=5000; for i=2:N
x(i)=mod(3125*x(i-1),(2^35-31)); u(i)=x(i)/(2^35-31); end
subplot(211)
plot(u(1:100));grid on ; ylabel('u(n)') xlabel('n') subplot(212)
hist(u,50);grid on ;
ylabel('histogram of u(n)')
程序中初始值取为100,数据长度取为5000,这是因为数据长度越长,其产生序列的随机性表现的越好,下文中将进行比较。
三、实验结果分析讨论
实验运行的结果如图1所示:
010203040
5060708090100
0.5
1
u (n )
n
00.10.20.30.40.50.60.70.80.91
50
100
150
h i s t o g r a m o f u (n )
图1.长度为N=5000的伪随机数产生方法的得到的均匀分布
图1中,上面部分为产生的数据,实验总共产生的数据有5000个,实验中截取前100个在图中做了显示。
下面部分为MATLAB 中hist 函数的应用,即将产生的数列分为50个部分,统计各部分中的个数,得到的图示类似于随机分布中的概率密度,从图中可以看出,其是基本符合均匀分布的概率密度特征的。
下面增加N 的数值,将N 设置为50000,重新运行,得到的结果如图2所示。
图2的概率密度分布相比于
010203040
50
60708090100
0.5
1
u (n )
n
00.10.20.30.40.50.60.70.80.91
500
1000
1500
h i s t o g r a m o f u (n )
图2.长度为N=50000的伪随机数产生方法的得到的均匀分布
图1,更加均匀,这也说明了增大采样数据数目,更容易看出随机分布的特点。
四、由均匀分布得到正态分布
得到均匀分布后,通过均匀分布得到想要的分布,有很多的变换方法,包括对已知概率密度的,未知概率密度的,参考文献中列举出了很多的方法,本实验仅采取其中的变换法来由均匀分布得到正态分布。
下面简述其基本原理。
变换法就是通过一个变换,将一个分布产生的随机变量转变为另一个分布产生的随机变量。
对正态分布,常用的变换为BOX-Muller 变换,它可以由均匀分布精确地产生正态随机分布。
其数学表达式如式(3)所示。
从数学上可以证明这种变换是精确地,这里不再叙述,可以查阅参考文献,本实验仅给出实验结果及验证[4][5]。
该变换的数学表达式为:
1222))
Y X Y X ππ⎧=⎪⎨=
⎪⎩ (3)
从表达式中可以看出,需要产生两组均匀分布的数列,按照上文中的方法,改变初始种子,产生两组不相关的均匀分布数列。
代码如下,初始种子分别为17和17* 133571。
代码如下:
x(1)=17; N=50000; for i=2:N
x(i)=mod(3125*x(i-1),(2^35-31)); u(i)=x(i)/(2^35-31); end
x1(1)=x(1)*133571;
for i=2:N
x1(i)=mod(3125*x1(i-1),(2^35-31)); u1(i)=x1(i)/(2^35-31);
y1(i)=sqrt(-2*log(u(i)))*sin(2*pi*u1(i)); end
subplot(211)
plot(y1(1:100));grid on ; ylabel('y(n)') xlabel('n') subplot(212)
hist(y1,50);grid on ; ylabel('histogram of y(n)')
y (n )
n
h i s t o g r a m o f y (n )
图3.由均匀分布得到的正态分布
运行结果如图所示,从图中可以看出,其概率密度函数,与实际的正态密度函数比较吻合,由此可以说明,本实验的模拟还是比较成功的。
五、总结
本实验模拟了在[0,1]区间上的均匀分布,采用乘同余法,然后通过变换法得到了正态随机分布,虽然是由计算机程序得到的,是“伪随机分布”,但是从概率密度上看,还是具有了真正随机分布的一些特征。
因此具有一定的实用价值。
参考资料:
[1]郑列,宋正义.伪随机数生成算法及比较[J]. 湖北工业大学学报,2008.10,23(5),65-68.
[2]张淑梅,李勇.计算机产生随机数的方法[J].数学通报,2006,45(3),44-45.
[3]朱晓玲,姜浩.任意概率分布的伪随机数研究和实现[J].计算机技术与发展,2007.12,
17(12),116-119.
[4]肖化昆.系统仿真中任意概率分布的伪随机数研究[J].计算机工程与设计,2005.1,26(1) 168-171.
[5]徐柏军,岳春国,徐正军.伪随机数实现及变换方法研究[J].科学技术与工程,2005.1,26 (1),2472-2475.。