1、 线性同余方法是目前应用广泛的伪随机数生成算法,其基本思想是通过对前一个数进行线性运算并取模从而得到下一个数,递归公式为:
其中a称为乘数,c称为增量,m称为模数,当a=0时为和同余法,当c=0时为乘同余法,c≠0时为混合同余法。 乘数、增量和模数的选取可以多种多样,只要保证产生的随机数有较好的均匀性和随机性即可,一般采用
m=2k
m
=
2
k
混合同余法。
线性同余法的最大周期是m,但一般情况下会小于m。要使周期达到最大,应该满足以下条件:
(1) c和m互质;
(2) m的所有质因子的积能整除a-1;
(3) 若m是4的倍数,则a-1也是;
(4) a,c,
x0
x
0
(初值,一般即种子)都比m小;
(5) a,c是正整数。
线性同余方法速度快,如果对乘数和模数进行适当的选择,可以满足用于评价一个随机数产生器的3 种准则:
(1)这个函数应该是一个完整周期的产生函数。也就是说,这个函数应该在重复之前产生出0 到m之间的所有数;
(2)产生的序列应该看起来是随机的;
(3)这个函数应该用32bit 算术高效实现。
2、例子:运用混合同于法生成1000个[0,1]内的均匀分布随机数
function A=fangzheng3(a,c,m,x)
A=zeros(1000,1);
n=1;
while n<=1000
n=n+1;
x=rem((a*x+c),m); %%rem(x,y):求整除x/y的余数
y=x/m;
A(n-1,1)=y;
End
运行:A=fangzheng3(97,3,1000,71),得到部分结果
序号 | 随机数 | 序号 | 随机数 | 序号 | 随机数 | 序号 | 随机数 | 序号 |
1 | 0.89 | 101 | 0.39 | 201 | 0.89 | 301 | 0.39 | 401 |
2 | 0.333 | 102 | 0.833 | 202 | 0.333 | 302 | 0.833 | 402 |
3 | 0.304 | 103 | 0.804 | 203 | 0.304 | 303 | 0.804 | 403 |
4 | 0.491 | 104 | 0.991 | 204 | 0.491 | 304 | 0.991 | 404 |
5 | 0.63 | 105 | 0.13 | 205 | 0.63 | 305 | 0.13 | 405 |
6 | 0.113 | 106 | 0.613 | 206 | 0.113 | 306 | 0.613 | 406 |
7 | 0.964 | 107 | 0.464 | 207 | 0.964 | 307 | 0.464 | 407 |
8 | 0.511 | 108 | 0.011 | 208 | 0.511 | 308 | 0.011 | 408 |
9 | 0.57 | 109 | 0.07 | 209 | 0.57 | 309 | 0.07 | 409 |
10 | 0.293 | 110 | 0.793 | 210 | 0.293 | 310 | 0.793 | 410 |
11 | 0.424 | 111 | 0.924 | 211 | 0.424 | 311 | 0.924 | 411 |
12 | 0.131 | 112 | 0.631 | 212 | 0.131 | 312 | 0.631 | 412 |
13 | 0.71 | 113 | 0.21 | 213 | 0.71 | 313 | 0.21 | 413 |
14 | 0.873 | 114 | 0.373 | 214 | 0.873 | 314 | 0.373 | 414 |
15 | 0.684 | 115 | 0.184 | 215 | 0.684 | 315 | 0.184 | 415 |
16 | 0.351 | 116 | 0.851 | 216 | 0.351 | 316 | 0.851 | 416 |
17 | 0.05 | 117 | 0.55 | 217 | 0.05 | 317 | 0.55 | 417 |
18 | 0.853 | 118 | 0.353 | 218 | 0.853 | 318 | 0.353 | 418 |
19 | 0.744 | 119 | 0.244 | 219 | 0.744 | 319 | 0.244 | 419 |
对生成的随机数进行一般的统计量进行计算,计算出生成随机数的均值和方差以及标准差,matlab程序如下:
sum=0;
for n=1:1000
sum=sum+A(n,1);
end
Avg=sum/1000 %计算其均值
s=0;
for n=1:1000
s=s+(A(n,1)-Avg)^2;
end
S=s/(1000-1) %计算其方差
Stdv=S^0.5 %计算其标准差
得到:
Avg = 0.4995
S = 0.0834
Stdv = 0.2888
可以看出,生成的均匀分布随机数是均值为0.5,标准差在0.3左右。m越大均值越接近1/2,方差越接近1/12。