产生正态分布随机数及M序列
- 格式:doc
- 大小:160.00 KB
- 文档页数:6
1. 编制两种方法产生正态分布随机数的程序并进行验证分析; 编程思路:产生正态分布随机数的两种方法:
(1) 统计近似抽样法:
a.设{i y }是(0,1)均匀分布的随机数序列,则
{}1
()0.5y i i i i E y y p y dy μ===⎰
1
220
()()1/12y i y i i y p y dy σμ=-=⎰
b.根据中心极限定理,当N →∞时,
1
1
2
()2
()~(0,1)/12
N
N
i y
i i i y
N
y k N y x k N N N μ
σ==--=
=
∑∑
c.如需产生均值为x μ,方差为2x σ的正态分布随机变量x ,只需如下计算:
212
~(,)/12
N
i i x x x x N y x N N μσμσ=-
=+∑,试验证明12N =时,x 的统计性质就
比较理想了。
(2) 变换抽样法:
设12,y y 是两个相互独立的(0,1)均匀分布的随机变量,则新变量
1/21121/2
212(2log )cos(2)
(2log )sin(2)
x y y x y y ππ⎧=-⎨=-⎩ 是相互独立的,服从(0,1)N 分布的随机变量。
利用统计近似抽样法和变换抽样法的定义及之前产生(0,1)均匀分布的随机数的基本方法如乘同余法、混合同余法等产生正态分布随机数。
调试过程遇到的问题:(1)在用统计近似抽样法产生正态分布随机数时,给定,μσ,然后用
Matlab 自带函数检验结果,感觉数据老对不上?
解决方法:自己设定的,μσ分别是均值,标准差,利用Matlab 自带函
数mean(),var()计算出来的分别是均值,方差,总觉得方差老对不上,其实是自己理解问题,var()计算出来的方差数值肯定是自己设定的标准差的平方大小左右。
(2)Matlab 下标从1开始;做运算两个矩阵的尺寸大小得对应上,还有
调用的值一定得有值。
程序运行结果分析得到的结论:
(1)统计近似抽样法:
50010001500200025003000350040004500
-50
5
10
统计近似抽样法(1)
-4
-202468050100150
200 0
50
100
150200250300
350
-4-2
024
6统计近似抽样法(2)
-3
-2-101234567
010203040
统计近似抽样法中要用产生的(0,1)序列的12个数的和,但具体哪12个,不太清楚,图(1)是:z(1)用的是x(1)~x(12),z(2)用的是x(2)~x(13),以此类推。
图(2)是把原来的(0,1)序列x 矩阵重新排列,成12的倍数,12行或者12列都行,按列和或者行和相加代入运算。
设定的2, 1.5μσ==,Matlab 计算结果:图一 1.9430, 1.5039μσ==;图二 1.9361, 1.4854μσ== 相比之下,第一种方法更接近理论值,当然这也与样本的大小多少脱离不了关系,图一正态分布随机数序列矩阵大小1*4096,图二正态分布随机数序列矩阵大小1*343.当然,不管哪种方法,计算出来的均值方差都与理论值接近,也少不了误差。
可见,利用统计近似抽样方法可以产生正态分布随机数。
(2)变换抽样法:
50010001500200025003000350040004500
-6-4-20
24变换抽样法(1)
-5
-4
-3
-2
-1
1
2
3
4
050100150200
250050010001500200025003000350040004500
-4-20
2
4变换抽样法(2)
-4
-3
-2
-1
1
2
3
4
050100150200250
利用课本上给的参考数值,得出(0,1)N 正态分布随机数。
图一0.00028113,0.9924μσ=-=;图二0.010419,0.9955μσ=-=,可见均值,标准差计算数值与给定理论值还是比较接近的。
所以,变换抽样法也可以产生正态分布随机数。
当然,以上方法都采用了混合同余法生成(0,1)均匀分布的随机数序列,误差大小也与所取的M ,A ,C 有关。
2.用下式产生伪随机数
1((21))(mod2)n p i i x x c +=++,21,n p ≤≤-c 为奇数。
编程思路:混合同余法:
混合同余法产生伪随机数的递推同余式为:
1()(mod )i i y Ay C M -=+ 其中2,2,21k n M k A =>=+,
C 为正整数,初值0y 为非负数,则/i i x y M =是周期为2k
的随机数。
利用混合同余法定义,选取合适参数,来产生随机数。
程序运行结果分析得到的结论:
050010001500200025003000350040004500
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
伪随机序列
并计算得0.4959,0.2891μσ==。
均值理论值为0.5,很接近,均方差理论值为0.3333,相对于均值来讲误差大些。
3. (1)用49i i i x x x --=⊕产生M 序列;
(2)以此M 序列为基础产生逆M 序列; (3)并将逆M 序列的幅值变为-a ,+a 。
编程思路:一段无限长二元序列121,,
,,
p p x x x x +各元素之间满足
1122i i i p i p x a x a x a x ---=⊕⊕⊕ ,121,,,p a a a -取0或1,p a =1,适当选择
121,,
,p a a a -可以使序列以(21)p -bit 的最长周期循环。
可以用线性反馈移位
寄存器产生M 序列,然后与周期为2bit 的序列相异或得到逆M 序列,再改变幅值即可。
调试过程遇到的问题:(1)因为给的式子是49i i i x x x --=⊕,所以写for 循环时得从10开始; (2)M 序列应赋9个初值,且算0,1个数时得写到循环里面。
程序运行结果分析得到的结论:
10
20
30
40
50
60
70
80
90
100
00.20.40.60.8
1M 序列
10
20
30
40
50
60
70
80
90
100
00.20.40.60.8
1
0102030405060708090100
-4
-202
4逆M 序列
0102030405060708090100
-4
-202
4
程序中检验了一个周期((21)p p N =-)M 序列中逻辑“0”和“1”出现的次数,一个周期(2p N )逆M 序列中逻辑“0”和“1”出现的次数。
结果为M 序列中count0=255,count1=256,满足M 序列的性质:一个循环周期中逻辑“1”出现的次数比逻辑“0”出现的次数多一次;逆M 序列中c0=511,c1=511,满足逆M 序列的性质:一个循环周期中逻辑“1”和逻辑“0”出现的几率均等。
说明移位寄存器产生的M 序列是正确的。