线性同余 产生伪随机数.pdf

线性同余 产生伪随机数.pdf

ID:53733811

大小:140.49 KB

页数:6页

时间:2020-04-20

线性同余 产生伪随机数.pdf_第1页
线性同余 产生伪随机数.pdf_第2页
线性同余 产生伪随机数.pdf_第3页
线性同余 产生伪随机数.pdf_第4页
线性同余 产生伪随机数.pdf_第5页
资源描述:

《线性同余 产生伪随机数.pdf》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、自己领悟把一.计算机中随机数的产生现在,在计算机,用来产生随机数的算法是“线性同余”法。所谓线性同余,其实就是下面两个式子。假设I就是一个随机数的序列,Ij+1与Ij的关系如下:Ij+1=Ij*a+c(modm)或是Ij+1=Ij*a(modm),其中,不妨取a=16807,m=2147483647,以为一常数。写个简单的程序就是:longr;voidscand(longv)//初始化随机种子数{r=v;}longrand()//产生随机数{r=(r*a+c)%m;//a,c,m为常数returnr;}再看一下稍

2、复杂一点的:(Random()的Borland的实现)longlongRandSeed=####;unsignedlongRandom(longmax){longlongx;doublei;unsignedlongfinal;x=0xffffffff;x+=1;RandSeed*=((longlong)134775813);RandSeed+=1;RandSeed=RandSeed%x;i=((double)RandSeed)/(double)0xffffffff;final=(long)(max*i);retu

3、rn(unsignedlong)final;}二.计算机产生的随机数不是真的随机数[引:]我们建立了真正调用伪随机数生成器的random()。但什么是伪随机数生成器?假定需要生成介于1和10之间的随机数,每一个数出现的几率都是一样的。理想情况下,应生成0到1之间的一个值,不考虑以前值,这个范围中的每一个值出现的几率都是一样的,然后再将该值乘以10。请注意,在0和1之间有无穷多个值,而计算机不能提供这样的精度。为了编写代码来实现类似于前面提到的算法,常见情况下,伪随机数生成器生成0到N之间的一个整数,返回的整数再除

4、以N。得出的数字总是处于0和1之间。对生成器随后的调用采用第一次运行产生的整数,并将它传给一个函数,以生成0到N之间的一个新整数,然后再将新整数除以N返回。这意味着,由任何伪随机数生成器返回的数目会受到0到N之间整数数目的限制。在大多数的常见随机数发生器中,N是232?(大约等于40亿),对于32位数字来说,这是最大的值。换句话说,我们经常碰到的这类生成器能够至多生成40亿个可能值。而这40亿个数根本不算大,只是指尖这么大。伪随机数生成器将作为“种子”的数当作初始整数传给函数。这粒种子会使这个球(生成伪随机数)一

5、直滚下去。伪随机数生成器的结果仅仅是不可预测。由伪随机数生成器返回的每一个值完全由它返回的前一个值所决定(最终,该种子决定了一切)。如果知道用于计算任何一个值的那个整数,那么就可以算出从这个生成器返回的下一个值。结果,伪随机数生成器是一个生成完全可预料的数列(称为流)的确定性程序。一个编写得很好的的PRNG可以创建一个序列,而这个序列的属性与许多真正随机数的序列的属性是一样的。例如:PRNG可以以相同几率在一个范围内生成任何数字。PRNG可以生成带任何统计分布的流。由PRNG生成的数字流不具备可辨别的模式。PRN

6、G所不能做的是不可预测。如果知道种子和算法,就可以很容易地推算出这个序列。计算机产生的随机数一般都只是一个周期很长的数列,不是真的随机数。也就是说,随机数一般是伪随机数,每个随机数都是由随机种子开始的一个已定的数列(周期很长)。一般地,为了随机数更真一点,随机种子在系统中通常是参照系统时钟生成的。看看下面这个例子,从中,读者应能有所体会。main(){inti;scand(time(NULL));/*可向计算机读取其时钟值,并把值自动设为随机数种子*/for(i=0;i<10;i++){printf("%10d"

7、,1+(rand()%6));/*这里1是移动值,他等于所需的连续整数*/}/*数值范围的第一个数;b是比例因子;他*/return(0);/*等于所需的连续整数值的范围宽度;*/}从数学上讲,为了得到一个周期性更长的随机序列,我们可以使用如下方法:(这是我在一个书上看到的,详细的情况大家可以查一查,我自己也记不清了,呵呵)floatrand(long*idum){intj;longk;staticlongiy=0;staticlongiv[NTAB];floattemp;if(*idum<=0

8、

9、!iy){if

10、(-(*idum)<1)*idum=1;else*idum=-(*idum);for(j=NTAB+7;j>=0;j--){k=(*idum)/IQ;*idum=IA*(*idum-k*IQ)-k*IR;if(*idum<0)*idum+=IM;if(j

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。