回 帖 发 新 帖 刷新版面

主题:关于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

回复列表 (共1个回复)

沙发

[url=http://www.worldgodshop.com/]Supra Shoes[/url]   [url=http://www.worldgodshop.com/]Radii shoes[/url]  [url=http://www.worldgodshop.com/]Prada Shoes[/url]   [url=http://www.worldgodshop.com/]Jordan shoes[/url]  [url=http://www.worldgodshop.com/]Christian Louboutin shoes[/url] 
http://www.worldgodshop.com/

我来回复

您尚未登录,请登录后再回复。点此登录或注册