如何在Fortran随机模拟器代码中更改种子数

问题描述 投票:0回答:1

我正在运行Fortran代码,该代码对标记的Poisson集群过程执行随机模拟。在实践中,事件属性(例如,发生时间)通过反演方法,即通过对累积分布函数的随机采样来生成。由于泊松随机性,我希望每个生成的序列都不同,但是事实并非如此。我猜想原因是伪随机数生成器的种子在每次模拟中都是相同的。我不了解Fortran,所以我不知道如何解决此问题。这是伪随机数生成器所涉及的代码部分,您知道吗?

subroutine pseud0(r)
c     generation of pseudo-random numbers
c     data ir/584287/
      data ir/574289/
      ir=ir*48828125
      if(ir) 10,20,20
   10 ir=(ir+2147483647)+1
   20 r=float(ir)*0.4656613e-9
      return
      end
      subroutine pseudo(random)
c     wichmann+hill (1982) Appl. Statist 31
      data ix,iy,iz /1992,1111,1151/
      ix=171*mod(ix,177)-2*(ix/177)
      iy=172*mod(iy,176)-35*(iy/176)
      iz=170*mod(iz,178)-63*(iz/178)
      if (ix.lt.0) ix=ix+30269
      if (iy.lt.0) iy=iy+30307
      if (iz.lt.0) iz=iz+30323
      random=mod(float(ix)/30269.0+float(iy)/30307.0+
     &            float(iz)/30323.0,1.0)
      return
      end
random fortran simulation random-seed stochastic-process
1个回答
0
投票

[首先,我将回顾PRNG的现代文献并选择一种现代的实现。其次,我将在现代Fortran中重写代码。您需要遵循@francescalus的建议,并有一种更新种子的方法。这是pseud0 prng

的一种方法
 subroutine init0(i)
    integer, intent(in) :: i
    common /myseed0/iseed
    iseed = i
 end subroutine init0

subroutine pseud0(r)
   common /myseed0/ir
   ir = ir * 48828125
   if (ir) 10,20,20
10 ir = (ir+2147483647)+1
20 r = ir*0.4656613e-9
end subroutine pseud0

program foo
   integer i
   real r1
   call init0(574289)  ! Original seed
   do i = 1, 10
      call pseud0(r1)
      print *, r1
   end do
   print *
   call init0(289574)  ! New seed
   do i = 1, 10
      call pseud0(r1)
      print *, r1
   end do
   print *
end program foo
© www.soinside.com 2019 - 2024. All rights reserved.