c RANPRB.F 05 April 1995 c program ranprb c c*********************************************************************** c write(*,*)' ' write(*,*)'RANPRB' write(*,*)'Tests for the random number routines of RANPACK.' write(*,*)' ' c call test01 call test02 call test03 call test04 call test05 call test06 call test07 call test08 call test09 call test10 call test11 call test12 call test13 call test14 call test15 call test16 call test17 stop end subroutine test01 c c*********************************************************************** c c Test ability of RANGET/RANSET to get and set the random number c seed. c integer i integer iseed1 integer iseed2 real ranf real x c write(*,*)' ' write(*,*)'TEST01' write(*,*)'Test RANF, RANGET and RANSET routines.' c c Get the current seed c call ranget(iseed1) write(*,*)' ' write(*,*)'RANGET reports current seed is ',iseed1 write(*,*)'Generate 10 random numbers with RANF:' write(*,*)' ' do i=1,10 x=ranf() write(*,*)x enddo call ranget(iseed2) write(*,*)' ' write(*,*)'RANGET reports current seed is ',iseed2 write(*,*)'Now have RANSET reset the seed to ',iseed1 call ranset(iseed1) write(*,*)' ' write(*,*)'Now generate 20 random numbers. The first 10' write(*,*)'should match the previous sequence:' do i=1,20 x=ranf() write(*,*)x enddo write(*,*)' ' write(*,*)'Now use RANSET to reset the seed to ',iseed2 write(*,*)'This should allow us to resume the first sequence' write(*,*)'where we left off. The next 10 numbers should' write(*,*)'match the last 10 of the set of 20.' write(*,*)' ' call ranset(iseed2) do i=1,10 x=ranf() write(*,*)x enddo return end subroutine test02 c c*********************************************************************** c c Test the average of 10000 random numbers. c integer ntest parameter(ntest=32) integer isd09 parameter (isd09=10) c integer npts parameter(npts=10000) c real aray20(npts) real aray25(npts) real ave real average(ntest) real halton integer i integer isd10 integer isd14 integer isd15 integer isd16 integer isd17 integer isd18 integer isd21 integer isd22 integer isd23 integer isd26 integer isd27 integer isd28 integer isdhal integer iseed integer iseed12(4) integer istart integer itest integer j integer jhi integer jsd23 integer ksd23 character name(ntest)*6 integer nsob real off real ran0 real ran1 real ran10 real ran11 real ran12 real ran13 real ran14 real ran15 real ran16 real ran17 real ran18 real ran19 real ran2 real ran21 real ran22 real ran22s real ran23 real ran24 real ran26 real ran27 real ran28 real ran29 real ran3 real ran4 real ran5 real ran6 real ran7 real ran8 real ran9 logical reset real sd29 real t11 real t8 real t9(isd09+1) real temp real temp25(64) real xsob(1) c write(*,*)' ' write(*,*)'TEST02' write(*,*)'Compute the average of 10000 successive random' write(*,*)'values, to see how far from 0.5 the answer is.' write(*,*)' ' c name(1)='ran0' name(2)='ran1' name(3)='ran2' name(4)='ran3' name(5)='ran4' name(6)='ran5' name(7)='ran6' name(8)='ran7' name(9)='ran8' name(10)='ran9' name(11)='ran10' name(12)='ran11' name(13)='ran12' name(14)='ran13' name(15)='ran14' name(16)='ran15' name(17)='ran16' name(18)='ran17' name(19)='ran18' name(20)='ran19' name(21)='ran20' name(22)='ran21' name(23)='ran22' name(24)='ran23' name(25)='ran24' name(26)='ran25' name(27)='ran26' name(28)='ran27' name(29)='ran28' name(30)='ran29' name(ntest-1)='halton' name(ntest)='sobol1' c do i=1,ntest average(i)=0.0 enddo c c Set initial seed for each generator that needs one. c t8=0.0 t9(1)=0.0 isd10=0 t11=0.0 iseed12(1)=istart() iseed12(2)=88 iseed12(3)=102 iseed12(4)=79 reset=.true. isd14=istart() isd15=istart() isd16=istart() isd17=istart() isd18=istart() call ran20(aray20,npts) isd21=istart() isd22=istart() temp=ran22s(isd22) isd23=istart() jsd23=istart() ksd23=istart() call ran23s(isd23,jsd23,ksd23) isd23=istart() jsd23=istart() call ran24s(isd23,jsd23) call ran25(0,temp25) do i=1,npts,64 call ran25(64,temp25) jhi=min(i+63,npts) do j=i,jhi aray25(j)=temp25(j+1-i) enddo enddo isd26=istart() temp=ran26(isd26) isd26=istart() isd27=istart() isd28=istart() sd29=0.123456789 c isdhal=istart() nsob=-1 call sobol1(nsob,xsob) nsob=1 c itest=1 iseed=istart() ave=0.0 do i=1,npts ave=ave+ran0(iseed) enddo ave=ave/real(npts) off=ave-0.5 write(*,*)name(itest),' average=',ave,' average-0.5=',off itest=2 iseed=istart() ave=0.0 do i=1,npts c ave=ave+ran1(iseed) enddo ave=ave/real(npts) off=ave-0.5 write(*,*)name(itest),' average=',ave,' average-0.5=',off itest=3 iseed=istart() ave=0.0 do i=1,npts ave=ave+ran2(iseed) enddo ave=ave/real(npts) off=ave-0.5 write(*,*)name(itest),' average=',ave,' average-0.5=',off itest=4 iseed=istart() ave=0.0 do i=1,npts ave=ave+ran3(iseed) enddo ave=ave/real(npts) off=ave-0.5 write(*,*)name(itest),' average=',ave,' average-0.5=',off itest=5 ave=0.0 do i=1,npts ave=ave+ran4() enddo ave=ave/real(npts) off=ave-0.5 write(*,*)name(itest),' average=',ave,' average-0.5=',off itest=6 ave=0.0 do i=1,npts ave=ave+ran5() enddo ave=ave/real(npts) off=ave-0.5 write(*,*)name(itest),' average=',ave,' average-0.5=',off itest=6 iseed=istart() ave=0.0 do i=1,npts ave=ave+ran6(iseed) enddo ave=ave/real(npts) off=ave-0.5 write(*,*)name(itest),' average=',ave,' average-0.5=',off itest=7 ave=0.0 do i=1,npts ave=ave+ran7() enddo ave=ave/real(npts) off=ave-0.5 write(*,*)name(itest),' average=',ave,' average-0.5=',off do i=1,npts average(9)=average(9)+ran8(t8) average(10)=average(10)+ran9(t9,isd09) average(11)=average(11)+ran10(isd10) average(12)=average(12)+ran11(t11) average(13)=average(13)+ran12(iseed12) average(14)=average(14)+ran13(reset) average(15)=average(15)+ran14(isd14) average(16)=average(16)+ran15(isd15) average(17)=average(17)+ran16(isd16) average(18)=average(18)+ran17(isd17) average(19)=average(19)+ran18(isd18) average(20)=average(20)+ran19() average(21)=average(21)+aray20(i) average(22)=average(22)+ran21(isd21) average(23)=average(23)+ran22() average(24)=average(24)+ran23() average(25)=average(25)+ran24() average(26)=average(26)+aray25(i) average(27)=average(27)+ran26(isd26) average(28)=average(28)+ran27(isd27) average(29)=average(29)+ran28(isd28) average(30)=average(30)+ran29(sd29) average(ntest-1)=average(ntest-1)+halton(isdhal) call sobol1(nsob,xsob) average(ntest)=average(ntest)+xsob(1) enddo c write(*,*)' ' do i=7,ntest average(i)=average(i)/real(npts) off=average(i)-0.5 write(*,*)name(i),' average=',average(i),' average-0.5=',off enddo return end subroutine test03 c c*********************************************************************** c c Test the distribution of 10000 random numbers. c integer ntest parameter(ntest=32) c integer npts parameter(npts=10000) c integer isd09 parameter(isd09=10) c real aray20(npts) real aray25(npts) real halton integer i integer ibin(ntest,10) integer ihi integer isd00 integer isd02 integer isd03 integer isd06 integer isd10 integer isd14 integer isd15 integer isd16 integer isd17 integer isd18 integer isd21 integer isd22 integer isd23 integer isd26 integer isd27 integer isd28 integer isdhal integer iseed(4) integer istart integer itest integer j integer jhi integer jsd23 integer ksd23 character name(ntest)*6 integer nsob real ran0 real ran1 real ran10 real ran11 real ran12 real ran13 real ran14 real ran15 real ran16 real ran17 real ran18 real ran19 real ran2 real ran21 real ran22 real ran22s real ran23 real ran24 real ran26 real ran27 real ran28 real ran29 real ran3 real ran4 real ran5 real ran6 real ran7 real ran8 real ran9 logical reset real sd29 real t11 real t8 real t9(isd09+1) real temp real temp25(64) real xhi real xlo real xsob(1) c write(*,*)' ' write(*,*)'TEST03' write(*,*)'Test distribution of 10000 successive random values.' write(*,*)'Compare the ranges 0