实验一计算机伪随机数的产生

上传人:ldj****22 文档编号:40511041 上传时间:2018-05-26 格式:DOC 页数:13 大小:199KB
返回 下载 相关 举报
实验一计算机伪随机数的产生_第1页
第1页 / 共13页
实验一计算机伪随机数的产生_第2页
第2页 / 共13页
实验一计算机伪随机数的产生_第3页
第3页 / 共13页
实验一计算机伪随机数的产生_第4页
第4页 / 共13页
实验一计算机伪随机数的产生_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《实验一计算机伪随机数的产生》由会员分享,可在线阅读,更多相关《实验一计算机伪随机数的产生(13页珍藏版)》请在金锄头文库上搜索。

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

2、数称为伪随机数。 1、A 平方取中法平方取中法 设有一个 b 进制 m 位数 ,自乘后一般得到一个 2m 位的数 2,如果不 足 2m 位,则在前面补 0,mm232 12 0210 LL取的中间 m 位数,得2 0mmmm 222121再取的中间位作,一一重复下去,我们得到 b 进制 m 位数列2 12。令 r=,则rn就是所求的伪随机数列。L,210m nb2、乘同余法乘同余法 乘同余法是按照下列公式产生的随机数)(mod1Mxxnn式中, 称为乘因子,M 是模数,给定初始值 x0后,可算出 x1 , x2 ,一般满足最多只有 M 个不同的值,所以xn是有周期的,其周期 ,0nnxMx L

3、M,且与 的选择有关。令Mxrnn/则不是真正的随机序列,但当 ,M,x0 选择得当,且周期 L , 10nnrr 足够大,则在同一周期有可能经得起统计检验。 3、混合同余法、混合同余法混合同余法是按照下列公式产生随机数,Mcxxnnmod)(1,M,c 均为非负整数,适当地选择 c 可以改善随机数的统计特性。,令 ,0nnxMx Mxrnn/则。10nr要得到一组优质的随机数,M,c 的选择非常重要,这些参 数可按如下规律选取:M=2L,L 为计算机字长,在混合同余法中,有=4q1+1,c=2a1+1理论分析和检验结果都表明, 的取值不宜过小。 可按如下方式选取,125s其中选择 s 使得成

4、立的最大整数。Ls2512p检验原理:检验原理: a)参数检验参数检验 参数检验就是检验伪随机数的特征参数的样本值与理论值是否有显著性 差异。 伪随机数的样本一阶矩、样本二阶矩和样本方差为NiiNiiNiirrrNsrNrrNr1222122141)5 . 0(111根据(0,1)均匀分布,难算得121)(31)(21)(22sErErENsDNrDNrD1801)(454)(121)(22定义三个检验统计量,)121(180)31(4521)21(122 3221sNurNurNu根据中心极限定理,检验统计量 u1, u2, u3 是渐近服从标准正态分布的。给定显著性水平 ,可确定临界值,即

5、满足uuuP如果,那么,我们说的平均值与 r 的理论值没有显著uu p1NrrrL,21性差异。如果,那么,我们说的样本二阶矩与 r 的二uup2NrrrL,21阶矩理论值没有显著性差异。如果,那么,我们说的uup3NrrrL,21样本方差与理论方差没有显著性差异。 b)b) 均匀性检验均匀性检验 均匀性检验又称为频率检验,主要检验经验频率与理论频率是否有显著 性差异。把(0,1)区间分为 K 个等份,以表示第 i 个小区间,用 ni表示),1(ki ki NrrrL,21中落在第 i 个区间的个数,则统计量 kiikNnNk12)(渐近服从自由度为(k-1)的分布。给定显著性水平 ,可确定二

6、个临2界值即满足),21 ()2(2 )1(2 )1(kk、1)2()21 (2 )1(22 )1(kkP因此,如果)2()21 (2 )1(22 )1(kk则认为经验频率与理论频率无显著性差异。 c)独立性检验独立性检验 独立性检验是检验各随机数之间的统计相关性。相关系数取值为零是两 个随机变量独立的必要条件,取值大小反映它们相关性的大小、故可用 平检验随机数的独立性。设有一伪随机数序列,则样本相关系数为NrrrL,2122)(1 )(srrrmNmmii 定义检验统计量mNmu)(那么 u 渐近服从标准正态分布。因此给定显著性水平 ,可确定临界值,那么,我们说的样本相关系数与 r 均值没有

7、显著性差异。uNrrrL,21三、实验内容三、实验内容利用 JAVA 语言实现伪随机数的产生及检验,程序代码及说明如下: 程序建立了三个类:类“Suiji”用来产生伪随机数,类“Check”对 产生伪随机数进行检验,类“Text”对程序进行功能测试。 类“Suiji”的方法 creat1(),creat2(),creat3()分别以 平方取中法、乘同余 法及混合同乘法各产生 100 个伪随机数;类“Check”方法 check1(), check3()分别对伪随机数序列进行参数检验、独立性检验(没有进行均 匀检验) 。 方法 creat2()以“平方取中法”产生伪随机数,程序对可能出现的 “退

8、化”进行了处理,即如果出现了“退化” ,则将初始值 initialValue 加 1,重新产生随机数序列,直到产生的随机数序列没 有“退化”为止。 平方取中法的中,取1054;o乘同余法中,取 X0=123,=7,M=10000;混合同余法中,取 X0=123,=7,M=10000,c=11; 类类 SuijiSuiji 原代码:原代码: /Suiji.java import javax.swing.*;public class Suijiprivate double a1;private double a2;private double a3;private long initialValu

9、e;public 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=100arrayValue1=(int)(e%100000)/10000;arrayValue2=(int)(e%10000)/1000;arrayValue3=

10、(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 Continue“+“,“r“,JOptionPane.PLAIN_MESSAGE); initial

11、Value+;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;i100;i+)a2i=(double)value/M;value=(yinZi*value)%M;public void creat3() /混合同乘法 final int x0=123;final int yinZi=7;final int M=10000;final int c=1

12、1;int value=x0;for(int i=0;i100;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.showMessageDialog(null,“数组长度错误“,“r“,JOptionPane.PLAIN_MESSAGE);System.exit(0); for(int i=0;i10

13、0;i+) b1i=a1i;b2i=a2i;b3i=a3i; public void print1() /打印平方取中法产生的随机数序列 String output=“Initial Value=“+initialValue+“n“; for(int i=0;i100;i+) output+=a1i+“ “;if(i%10=0 JOptionPane.showMessageDialog(null,output,“r“,JOptionPane.PLAIN_MESSAGE); public void print2() /打印乘同余法产生的随机数序列 String output=“; for(int

14、 i=0;i100;i+) output+=a2i+“ “;if(i%10=0 JOptionPane.showMessageDialog(null,output,“r“,JOptionPane.PLAIN_MESSAGE); public void print3() /打印混合同乘法产生的随机数序列 String output=“;for(int i=0;i100;i+) output+=a3i+“ “;if(i%10=0 JOptionPane.showMessageDialog(null,output,“r“,JOptionPane.PLAIN_MESSAGE); 类类 Check 原代

15、码:原代码: /Check.java import javax.swing.*;public class Checkpublic boolean check1(double a) / 参数检验,选 a=0.95 ua=1.96 if(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;i100;i+) r1+=ai; r2+=(ai*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)*(r

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号