主题:关于fortran随机数发生器的问题
这是一个利用随机数发生器r250和16807分别产生两个随机数,来计算圆周率的程序(在单位矩形内作内切圆,然后投点。判断投出来的随机点是否在圆内,根据总的投点数和圆内的投点数来计算圆周率的值)。其中,r250产生随机数时调用rdm一次,16807自己产生随机数时也调用rdm,感觉好像有冲突,计算速度太慢,没有调用系统随机数时快速。请高手帮忙!感激不尽了,下面是代码:
!MS$DEBUG
program yy
use MSFLIB
implicit none
integer n,ns
integer*4 i,xn,xn1,m,x250(0:249)
double precision a1,a2,jl,pi
common /pp/ x250
xn=2005
x250(0)=2011
xn1=2011
do i=1,249
call rdm(xn,m)
x250(i)=xn
enddo
ns=200000
n=0
do i=1,ns
call rdm250(i,xn)
a1=xn/2147483648.d0
call rdm(xn1,m)
a2=xn1/2147483648.d0
jl=dsqrt((a1-0.5d0)**2+(a2-0.5d0)**2)
if (jl.le.0.5d0) n=n+1
enddo
pi=n*4.d0/ns
write(*,*)'ns=',ns,' ','pi=',pi
end
subroutine rdm(xn,m)
integer(4) xn,c,m
double precision yy,a
a=16807.d0
c=0
m=2147483647
yy=a*xn+c
do while(yy.gt.2147483647)
yy=yy-2147483647-1
end do
xn=yy
end
subroutine rdm250(im,xm)
integer(4) x250(0:249),im,xm
common /pp/ x250
xm=ieor(x250(mod(im+250-1-250,250)),x250(mod(im+250-1-103,250)))
x250(mod(im+250-1,250))=xm
end
!MS$DEBUG
program yy
use MSFLIB
implicit none
integer n,ns
integer*4 i,xn,xn1,m,x250(0:249)
double precision a1,a2,jl,pi
common /pp/ x250
xn=2005
x250(0)=2011
xn1=2011
do i=1,249
call rdm(xn,m)
x250(i)=xn
enddo
ns=200000
n=0
do i=1,ns
call rdm250(i,xn)
a1=xn/2147483648.d0
call rdm(xn1,m)
a2=xn1/2147483648.d0
jl=dsqrt((a1-0.5d0)**2+(a2-0.5d0)**2)
if (jl.le.0.5d0) n=n+1
enddo
pi=n*4.d0/ns
write(*,*)'ns=',ns,' ','pi=',pi
end
subroutine rdm(xn,m)
integer(4) xn,c,m
double precision yy,a
a=16807.d0
c=0
m=2147483647
yy=a*xn+c
do while(yy.gt.2147483647)
yy=yy-2147483647-1
end do
xn=yy
end
subroutine rdm250(im,xm)
integer(4) x250(0:249),im,xm
common /pp/ x250
xm=ieor(x250(mod(im+250-1-250,250)),x250(mod(im+250-1-103,250)))
x250(mod(im+250-1,250))=xm
end