|
何光渝的frotran算法程序集中给出的四个函数
ran3为减去法生成0~1间随机数,
确实好用,尤其是在一次循环中
比如
DO I=1,N1
......
X=ran3(idum)
...........
ENDDO
但是将程序运行两遍,发现生成的随机数是一样的!
正如上个帖子说的,
假如这个ran3函数位于三层循环的内层,
那外两层生成的东西岂不是一样的?
还有,不同时刻运行出来的结构还是一样的!
PROGRAM ZZ
USE IMSL
USE DFLIB
IMPLICIT NONE
REAL(KIND=8)::X
INTEGER(KIND=8)::k,I,J,INTTEMP
REAL(KIND=8),EXTERNAL::RAN3,RAN1
OPEN(UNIT=10,FILE='XXX.TXT')
DO k=1,94000,1
!CALL RANDOM_SEED()
!CALL RANDOM_NUMBER(x)
INTTEMP=K+10
X=RAN3(INTTEMP)
WRITE(10,9999)K,X
9999 FORMAT(I10,',',F10.4)
ENDDO
END PROGRAM ZZ
!##############################################################################
FUNCTION ran3(idum)
!¾ùÔÈ·Ö²¼Ëæ»úÊýÉú³É³ÌÐò
INTEGER(KIND=8)::idum
INTEGER MBIG,MSEED,MZ
!REAL MBIG,MSEED,MZ
REAL ran3,FAC
PARAMETER (MBIG=1000000000,MSEED=161803398,MZ=0,FAC=1./MBIG)
!PARAMETER (MBIG=4000000.,MSEED=1618033.,MZ=0.,FAC=1./MBIG)
INTEGER i,iff,ii,inext,inextp,k
INTEGER mj,mk,ma(55)
!REAL mj,mk,ma(55)
SAVE iff,inext,inextp,ma
DATA iff /0/
if(idum<0.or.iff==0) then
iff=1
mj=MSEED-iabs(idum)
mj=mod(mj,MBIG)
ma(55)=mj
mk=1
do i=1,54
ii=mod(21*i,55)
ma(ii)=mk
mk=mj-mk
if(mk<MZ) mk=mk+MBIG
mj=ma(ii)
end do
do k=1,4
do i=1,55
ma(i)=ma(i)-ma(1+mod(i+30,55))
if(ma(i)<MZ) ma(i)=ma(i)+MBIG
end do
end do
inext=0
inextp=31
idum=1
endif
inext=inext+1
if(inext==56) inext=1
inextp=inextp+1
if(inextp==56) inextp=1
mj=ma(inext)-ma(inextp)
if(mj<MZ) mj=mj+MBIG
ma(inext)=mj
ran3=mj*FAC
END FUNCTION ran3
!############################################################################## |
|