【发布时间】:2020-02-06 23:50:25
【问题描述】:
我正在运行一个 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
【问题讨论】:
-
种子被硬编码到源中。您可以简单地更改那里的值(在
data语句中),但如果您想做一些更奇特的事情,那么这将需要重新设计。 -
问题是我需要运行这段代码至少 100 次,这样每次手动编辑种子会很麻烦。
-
一种方法是从命令行传递种子,这样您的代码就不需要更改和重新编译。另一种方法是从
/dev/urandom(posix 系统)读取“随机性”。 -
谢谢@PierredeBuyl,我不应该编辑代码让它接受来自命令行的输入吗?
标签: random fortran simulation random-seed stochastic-process