** The function rano()举例rano** is an "Minimal" random number generatorofParkandMillerdoublerano(long&idum)** Set or reset the input value** idum to any integer value (except theconstint a=16807,m=2147483647,unlikelyvalueMASK)q=127773;** to initialize the sequence; idum must not beconst int r=2836, MASK=123459876;alteredbetweenconst double am = 1./m;** calls for successive deviates in a sequence.long k;** The function returns a uniform deviatedouble ans;idum^=MASK;between0.0and1.0.k = idum/q;idum=a*(idum-k*g)-r*k;//addmifnegativedifferenceif(idum <0) idum += m;ans=am*(idum);idum ^= MASK;N,=(aN,_1)MOD(M)(aN,-1)MOD(M)=(aN,-1-[N,-1/q]M)MOD(M)returnans;M=aq+r(aN;-1)MOD(M)= (aN,-1-[Ni-1/q)(aq+r)MOD(M)1//End:functionrano()q=[M/a],r=MMODa(aN,-1)MOD(M)=(a(Ni_1-[N;_1/q]q)-[N,_1/q]r))MOD(M)(aN;-1)MOD(M)=(a(N,-MOD(g))-[N,-1/q)r))MOD(M)
举例ran0 double ran0(long &idum) { const int a = 16807, m = 2147483647, q = 127773; const int r = 2836, MASK = 123459876; const double am = 1./m; long k; double ans; idum ^= MASK; k = idum/q; idum = a*(idum - k*q) - r*k; // add m if negative difference if(idum < 0) idum += m; ans=am*(idum); idum ^= MASK; return ans; } // End: function ran0() ** The function ran0() ** is an "Minimal" random number generator of Park and Miller ** Set or reset the input value ** idum to any integer value (except the unlikely value MASK) ** to initialize the sequence; idum must not be altered between ** calls for successive deviates in a sequence. ** The function returns a uniform deviate between 0.0 and 1.0
if(idum <= 0) (举例ran2if(-(idum)<1) idum = 1;elseidum = -(idum);idum2 = (idum);doubleran2(long &idum)for(j = NTAB + 7;j >= O; j--) ((k=(idum)/IQ1;idum=IA1*(idum-k*IQ1)-k*IR1:constintIM1=2147483563;if(idum<0)idum+=IM1;constintIM2=2147483399;if(i<NTAB)iv[il=idum;}constdoubleAM=1./IM1;iy=iv[0];constdoubleIMM1=IM1-1;1const intIA1=40014;k = (idum)/IQ1;const int1A2=40692;idum=IA1*(idum-k*IQ1)-k*IR1;constintIQ1=53668if(idum<0) idum += IM1;constintIQ2=52774;k=idum2/IQ2;const intIR1=12211;idum2=1A2*(idum2-k*IQ2)-k*IR2constintIR2=3791;if(idum2< 0) idum2 += IM2;constintNTAB=32;j=iy/NDIV;constintNDIV=1+IMM1/NTABiy =iv[i] -idum2;constdoubleEPS=1.2e-7;ivli] = idum;constdoubleRNMX=1.0-EPS;intj;if(iy<1) iy +=IMM1;k;longif(temp=AM*iy)>RNMX)returnRNMX;elsereturntemp;static longidum2=1234567891//End:functionran2()static longiy=0;static longiv[NTAB];Thefunctionran2()isalongperiod(>2x10^18)randomnumberdoubletemp;generatorofL'EcuyerandBays-Durhamshuffleand addedsafeguardsCall with iduma negative integerto initialize;thereafter,donot alteridumbetweensuccessivedeviatesinasequence.RNMXshouldapproximatethelargestfloatingpointvaluethat islessthan1.Thefunctionreturnsauniformdeviatebetweeno.0and1.0
举例 ran2 double ran2(long &idum) { const int IM1=2147483563; const int IM2=2147483399; const double AM = 1./IM1; const double IMM1 = IM1-1; const int IA1=40014; const int IA2=40692; const int IQ1=53668; const int IQ2=52774; const int IR1=12211; const int IR2=3791; const int NTAB=32; const int NDIV=1+IMM1/NTAB; const double EPS=1.2e-7; const double RNMX=1.0-EPS; int j; long k; static long idum2 = 123456789; static long iy=0; static long iv[NTAB]; double temp; if(idum <= 0) { if(-(idum) < 1) idum = 1; else idum = -(idum); idum2 = (idum); for(j = NTAB + 7; j >= 0; j-) { k = (idum)/IQ1; idum = IA1*(idum - k*IQ1) - k*IR1; if(idum < 0) idum += IM1; if(j < NTAB) iv[j] = idum; } iy=iv[0]; } k = (idum)/IQ1; idum = IA1*(idum - k*IQ1) - k*IR1; if(idum < 0) idum += IM1; k = idum2/IQ2; idum2 = IA2*(idum2 - k*IQ2) - k*IR2; if(idum2 < 0) idum2 += IM2; j = iy/NDIV; iy = iv[j] - idum2; iv[j] = idum; if(iy < 1) iy += IMM1; if((temp = AM*iy) > RNMX) return RNMX; else return temp; } // End: function ran2() The function ran2() is a long period (> 2 x 10^18) random number generator of L'Ecuyer and Bays-Durham shuffle and added safeguards. Call with idum a negative integer to initialize; thereafter, do not alter idum between successive deviates in a sequence. RNMX should approximate the largest floating point value that is less than 1. The function returns a uniform deviate between 0.0 and 1.0
随机性的统计检验伪随机数的好环通常是由各种统计检验来判定,这统计些检验包括:均匀性检验、独立性检验、组合规律检验、无连贯性检验、参数检验等等。这是必要条件不是充分条件(不能通过检验的必定不是好的产生器,但通过有限个检验指标的也不能保证它是好的)最基本的有两种:均匀性检验和独立性检验:。均匀性检验是指在0,1区间内等长度子区间中随机数的数量是一样的:独立性检验是按先后顺序出现的若干个随机数中,每一个数的出现都和它前后的各个数无关。一个好的伪随机数序列能通过的检验越多,那么该产生器就会越优良可靠。均匀性检验:均匀性检验的方法很多,如有2检验,K一S检验,序列检验
随机性的统计检验
随机性的统计检验设有在区间[0,1]上的伪随机数序列为[$1,S2..Sn]如果该伪随机数是均匀分布的,则将[0.1]区间分成k个相等的子区间7后,落在每个子区间的伪随机数个数应当近似为mk=,此数为理论频数。统计随机数落在第k个子区间的实际频数nk,它应当趋近于理论频数mk。●注意此处的nk是整数而mk可以是小数。●考察统计量2,它定义为:k(nk-mk)?x?=mkk=-1。如果?2值很大,表示远远偏离理想值,因此要求×2值尽可能小。通常求和中的每一项的大小约为1,因此×2的值约为k。概率论中的Pearson定理说明,(15)式的极限概率分布是2(k一1)分布
随机性的统计检验
随机性的统计检验1t(u-2)/2e-t/2dtP(x2≤ /) =20/2T(u/2)它给出了(15)式中的其中×2<的概率。整数U是系统的自由度,表示独立测量的次数。k。但是有一个约束条件存在,mk=N,故自由度u=k-1。。据此可以假定一个显著性水平值来进行检验。当给定显著水平α后(或置信度1-α),由方程P(x)=1-α解出X值,或者直接从×2表查得k一1个自由度的显著水平为α时的xg值。。如果由(16)式计算出来的×小于Xg,则认为在此置信度下,原伪随机数在[0,1]区间是均匀分布的假定是正确的。●如果由(16)式计算出来的大于X,则认为在α的显著水平下,伪随机数不满足均匀性的要求
随机性的统计检验