取中法虽然0.1区间上的均匀分布十分简单,但是这个简单分布的随机数对使用随机模拟方法解决问题是十分重要的。许多其他形式的分布(如正态分布,指数分布,二项分布等的随机数通过舍选变换等抽样方法,都可以从0.11区间的均匀分布的随机数,经过变换得到。最早的伪随机数产生器可能是冯诺依曼平方取中法:该方法首先给出一个2r位的数,取它的中间的r位数码作为第一个伪随机数:然后将第一个伪随机数平方构成一个新的2r位数,再取中间的r位数作为第二个伪随机数。如此循环便得到一个伪随机数序列。比如一个十进制数列的例子。Xo三6031,递推之后x1=3729,,X2=9054,X3=9749相应的[0,1]上的均匀分布就为s;=1000(注:以后如不做特殊说明,一般,1,Sn...表示01]区间的上均匀分布的抽样序列)这种方法虽然简单,但是均匀性不好,且数列很快趋近于0,数列的长?度也难以确定
取中法
线性同余法●如今比较流行,并用得最多的是线性同余产生器,全称为LinearCongruenceGenerator,此方法利用数论中的同余运算来产生随机数,故称为同余发生器。有关同余运算的的相关性质请自行参考数学相关书籍。●通过如下的线性同余关系递推公式式来产生数列rn+1= (arn +c)(modm)。那么[0.1]区间上的均匀分布的随机数为Sn=an/m。显然nE[0,1],上式中参数a,c,m.xo的选取十分关键。其中xo称为种子,改变它的值就得到基本序列的不同区段。a,c,m,o为大于零的整数,分别叫做乘子,增量,模和初值。选择这些参数时需要使得产生出的伪随机数的循环周期要尽可能长
线性同余法
线性同余法xn+1 =(6x, +7)(mod 5), x。 = 24, 1, 3, 0, 2, 4, 1, 3, ...xn+ =(27x, +11)(mod 54), x =211, 38,11,
线性同余法 4, 1, 3, 0, 2, 4, 1, 3, . 11, 38, 11,
线性同余法an+1=(acn+c)(modm当c≠0时可以实现最大周期m(注:这里只给出结论,数学证明不需要作深入了解,相关证明可参考相关同余的性质)同时要达到最大周期m.还需要同时满足以下条件:。(1)c与m互质(即它们的公因数只有1)。(2)对m的任一因子p,满足a三1(modp),即a-1应被p整除(3)如果4是m的因子,则a三1(mod4),即a-1应被4整除实际应用中,通常选取:m=2L,a=4g+1c=2p+1●其中p,9,L均为正整数,此时:trTn+1=[(4g+1)rn +(2p+1)(mod2'), Sn=上述参数的一般是通过定性分析和计算机试验来选择,使得到的伪随机数列具有足够长的周期,而且独立性和均匀性都能通过一系列的检验
线性同余法
C++的线性同余法函数来初如果想每次产生的随机数不同,通常我们需要srand始化随机数发生器,即为随机数发生器设定种子:void srand(unsigned seed);此函数同样来自于stdlib.h。至于种子怎么选,一般常用的方法是利用time函数(声明在头文件time.h)来获得系统时间,然后将time_t型数据转化为unsigned型再传给srand函数,即srand((unsigned) time(NULL );如果想产生其他范围的随机数,例如a,b则需要利用求余运算rand%(b - a) + a;如果是产生0.11范围内的浮点型随机数,则(double)randO/RAND_MAX
C++的线性同余法