计算机伪随机数的产生_第1页
计算机伪随机数的产生_第2页
计算机伪随机数的产生_第3页
计算机伪随机数的产生_第4页
计算机伪随机数的产生_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验一 计算机伪随机数的产生一、实验目的通过计算机高级语言编程产生一系列伪随机数,掌握平方取中法、乘同余法、混合同余法产生均匀随机数的方法。编程对产生的随机数进行检验,掌握参数检验、均匀性检验和独立性检验的思想和方法。二、实验原理可以用数学方法产生均匀随机数,数学方法就是用数学公式计算出一组序列,很显然这种方法得到的数不是随机数,因为给定初始值后,拧紧公式计算出来的数据序列是,并且经过一定的时间后,还会出现周期性的重复。不过,如果计算方法选择得当,它们可以认为是相互独立的、均匀分布的、经得起数理统计的独立性和均匀性检验,这种随机数称为伪随机数。1、A平方取中法设有一个b进制m位数,自乘后一般得

2、到一个2m位的数2,如果不足2m位,则在前面补0, 取的中间m位数,得 再取的中间位作,一一重复下去,我们得到b进制m位数列。令r=,则rn就是所求的伪随机数列。2、 乘同余法乘同余法是按照下列公式产生的随机数 式中,称为乘因子,M是模数,给定初始值x0后,可算出x1 , x2 ,一般满足最多只有M个不同的值,所以xn是有周期的,其周期LM,且与的选择有关。 令 则不是真正的随机序列,但当,M,x0 选择得当,且周期L足够大,则在同一周期有可能经得起统计检验。3、混合同余法 混合同余法是按照下列公式产生随机数, ,M,c均为非负整数,适当地选择c可以改善随机数的统计特性。,令 则。 要得到一组

3、优质的随机数,M,c的选择非常重要,这些参数可按如下规律选取:M=2L,L为计算机字长,在混合同余法中,有=4q1+1,c=2a1+1 理论分析和检验结果都表明,的取值不宜过小。可按如下方式选取, 其中选择s使得成立的最大整数。检验原理:a) 参数检验参数检验就是检验伪随机数的特征参数的样本值与理论值是否有显著性差异。伪随机数的样本一阶矩、样本二阶矩和样本方差为 根据(0,1)均匀分布,难算得 定义三个检验统计量, 根据中心极限定理,检验统计量u1, u2, u3 是渐近服从标准正态分布的。 给定显著性水平,可确定临界值,即满足 如果,那么,我们说的平均值与r的理论值没有显著性差异。如果,那么

4、,我们说的样本二阶矩与 r 的二阶矩理论值没有显著性差异。如果,那么,我们说的样本方差与理论方差没有显著性差异。b) 均匀性检验均匀性检验又称为频率检验,主要检验经验频率与理论频率是否有显著性差异。把(0,1)区间分为K个等份,以表示第i 个小区间,用ni表示中落在第i个区间的个数,则统计量渐近服从自由度为(k-1)的分布。给定显著性水平,可确定二个临界值即满足 因此,如果则认为经验频率与理论频率无显著性差异。c) 独立性检验独立性检验是检验各随机数之间的统计相关性。相关系数取值为零是两个随机变量独立的必要条件,取值大小反映它们相关性的大小、故可用平检验随机数的独立性。 设有一伪随机数序列,则

5、样本相关系数为定义检验统计量那么u渐近服从标准正态分布。因此给定显著性水平,可确定临界值,那么,我们说的样本相关系数与r 均值没有显著性差异。三、实验内容利用JAVA语言实现伪随机数的产生及检验,程序代码及说明如下:程序建立了三个类:类“Suiji”用来产生伪随机数,类“Check”对产生伪随机数进行检验,类“Text”对程序进行功能测试。类“Suiji”的方法creat1(),creat2(),creat3()分别以 平方取中法、乘同余法及混合同乘法各产生100个伪随机数;类“Check”方法check1(),check3()分别对伪随机数序列进行参数检验、独立性检验(没有进行均匀检验)。方

6、法creat2()以“平方取中法”产生伪随机数,程序对可能出现的“退化”进行了处理,即如果出现了“退化”,则将初始值initialValue加1,重新产生随机数序列,直到产生的随机数序列没有“退化”为止。平方取中法的中,取1054;乘同余法中,取X0=123,=7,M=10000; 混合同余法中,取X0=123,=7,M=10000,c=11;类Suiji原代码:/Suiji.javapublic class Suiji private double a1; private double a2; private double a3; private long initialValue;publ

7、ic Suiji()a1=new double100;a2=new double100;a3=new double100;initialValue=1054;creat1();creat2();creat3();public void creat1()/平方取中法 long bValue,e; int arrayValue=new int4; bValue=initialValue;for(int i=0;i<100;i+)a1i=(double)bValue)/10000;e=bValue*bValue;if(e=0)/如果出现0,提示“退化”并使初始值加1,重新产生随机数序列/JOp

8、tionPane.showMessageDialog(null,"退化","r",JOptionPane.PLAIN_MESSAGE);initialValue+;bValue=initialValue;i=-1;continue;else if(e<=99) arrayValue0=arrayValue1=arrayValue2=arrayValue3=0; else if(e>=100&&e<=999) arrayValue0=arrayValue1=arrayValue2=0; arrayValue3=(int)e

9、/100; else if(e>=1000&&e<=9999) arrayValue0=arrayValue1=0; arrayValue2=(int)e/1000; arrayValue3=(int)(e-arrayValue2*1000)/100; else if(e>=10000&&e<99999) arrayValue0=0; arrayValue1=(int)e/10000; arrayValue2=(int)(e%10000)/1000; arrayValue3=(int)(e%1000)/100; else if(e>

10、=100000&&e<=999999) arrayValue0=(int)e/100000; arrayValue1=(int)(e%100000)/10000; arrayValue2=(int)(e%10000)/1000; arrayValue3=(int)(e%1000)/100; else if(e>=1000000&&e<=99999999) arrayValue0=(int)(e%1000000)/100000; arrayValue1=(int)(e%100000)/10000; arrayValue2=(int)(e%1000

11、0)/1000; arrayValue3=(int)(e%1000)/100; bValue=(long)(arrayValue0*1000+arrayValue1*100+arrayValue2*10+arrayValue3);for(int j=0;j<=i;j+)/检验是否退化,如果退化则使初始值加1,重新产生天机数序列if(bValue=(int)(a1j*10000)/JOptionPane.showMessageDialog(null,"IniValue="+iniValue+"退化"+"nPress OK to Contin

12、ue"+"","r",JOptionPane.PLAIN_MESSAGE);initialValue+;bValue=initialValue;i=-1;break;public void creat2() /乘同余法 final int x0=123; /各初始值选定如下 final int yinZi=7; final int M=10000; int value=x0; for(int i=0;i<100;i+) a2i=(double)value/M; value=(yinZi*value)%M; public void crea

13、t3()/混合同乘法final int x0=123; final int yinZi=7; final int M=10000; final int c=11; int value=x0; for(int i=0;i<100;i+) a3i=(double)value/M; value=(yinZi*value+c)%M; public void getNumber(double b1,double b2,double b3)/取出产生产随机数序列if(b1.length!=100|b2.length!=100|b3.length!=100)JOptionPane.showMessag

14、eDialog(null,"数组长度错误","r",JOptionPane.PLAIN_MESSAGE);System.exit(0);for(int i=0;i<100;i+) b1i=a1i; b2i=a2i; b3i=a3i;public void print1()/打印平方取中法产生的随机数序列String output="Initial Value="+initialValue+"n"for(int i=0;i<100;i+) output+=a1i+" " if(i%10

15、=0&&i!=0) output+="n"JOptionPane.showMessageDialog(null,output,"r",JOptionPane.PLAIN_MESSAGE);public void print2()/打印乘同余法产生的随机数序列String output=""for(int i=0;i<100;i+) output+=a2i+" " if(i%10=0&&i!=0) output+="n"JOptionPane.showMess

16、ageDialog(null,output,"r",JOptionPane.PLAIN_MESSAGE);public void print3()/打印混合同乘法产生的随机数序列String output=""for(int i=0;i<100;i+) output+=a3i+" " if(i%10=0&&i!=0) output+="n"JOptionPane.showMessageDialog(null,output,"r",JOptionPane.PLAIN_MESS

17、AGE);类Check原代码:/Check.javapublic class Checkpublic boolean check1(double a)/参数检验,选a=0.95 ua=1.96if(a.length!=100)JOptionPane.showMessageDialog(null,"数组长度错误","r",JOptionPane.PLAIN_MESSAGE);System.exit(0);double r1=0.0,r2=0.0,s;double u1,u2,u3;for(int i=0;i<100;i+)r1+=ai;r2+=(ai

18、*ai);r1/=100;r2/=100;s=r2-r1+0.25;u1=(Math.sqrt(12*100)*(r1-0.5);u2=0.5*(Math.sqrt(45*100)*(r2-1.0/3.0);u3=(Math.sqrt(180*100)*(s-1.0/12.0);JOptionPane.showMessageDialog(null,"u1="+u1+"nu2="+u2+"nu3="+u3,"参数检验",JOptionPane.PLAIN_MESSAGE);if(Math.abs(u1)<1.9

19、6&&Math.abs(u2)<1.96&&Math.abs(u3)<1.96) return true;else return false;public boolean check3(double a)/独立性检验if(a.length!=100)JOptionPane.showMessageDialog(null,"数组长度错误","消息",JOptionPane.PLAIN_MESSAGE);System.exit(0);double r1=0.0,r2=0.0,sum=0.0,s,pm,u;final

20、int m=10;for(int i=0;i<100;i+)r1+=ai;r2+=(ai*ai);r1/=100;r2/=100;s=r2-r1+0.25;for(int i=0;i<100-m;i+)sum+=ai*ai+m; pm=(1.0/(100-m)*sum-r1*r1)/s; u=Math.sqrt(100-m)*pm; JOptionPane.showMessageDialog(null,"u="+u,"独立性检验",JOptionPane.PLAIN_MESSAGE); if(Math.abs(u)<1.96) retu

21、rn true;else return false; 类Text原代码:/Text.javapublic class Textpublic static void main(String args)/对各方法产生的随机数序列用各检验方法检验double aa1=new double100;double aa2=new double100;double aa3=new double100;Check check=new Check();Suiji a=new Suiji();a.getNumber(aa1,aa2,aa3);a.print1();if(check.check1(aa1)&&check.check3(aa1) JOptionPane.showMessageDialog(null,"通过检验","检验结果",JOptionPane.PLAIN_MESSAGE);else JOptionPa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论