【发布时间】:2018-12-05 23:10:51
【问题描述】:
以下代码取自prng,用 Fortran 77 编写。
double precision function usran(ir)
c
c this subroutine generates random values between 0.0 and 1.0 using
c an integer seed
c it is based on the imsl routine ggubs.
c
c double precision version
c
implicit double precision (a-h,o-z)
parameter(da=16807.d0,db=2147483647.d0,dc=2147483648.d0)
ir=abs(mod(da*ir,db)+0.5d0)
usran=dfloat(ir)/dc
return
end
在我看来ir 是种子输入,它是一个重新分配的整数,理想情况下它返回一个介于 0 和 1 之间的随机数,然后将其用作下一个种子值。但我不明白它是如何工作的?
我的意思是如果我有一个初始随机值作为我的seed,那么输入usran(seed)返回一个在(0,1)中的值,那么如何调用当前序列中的下一个值呢?
我想不出更具体的标题。
【问题讨论】:
-
我不太明白你的问题。你知道
seed,通过参数ir也会被修改吗?也就是说,函数会对传递的内容产生影响,而不仅仅是产生结果。 -
我只是对返回值如何用作下一个种子值感到困惑?我可以看到它已被修改,举个简单的例子,如果我最初的
seed = 12345,然后ir =abs(mod(12345*da,db)+0.5),然后usran(seed)返回ir/dc,我明白你的意思是我们现在有了一个新的 ir 值,但它是如何实现的贡献一个新的种子值,是否还需要评估usran(seed)才能获得下一个值? -
换句话说,这是如何顺序的?如果它不是连续的,那么是什么使它成为 PRNG?
-
“顺序”是什么意思?您使用种子调用该函数并返回一个“随机数”和一个新种子。您传递这个新种子以获得下一个值和另一个新种子。也许您可以向我们展示您希望如何在主程序中使用生成器的上下文?如果不这样做,它会给我们一些“纠正”的东西。
-
@francescalus,我想我对如何将新种子 -
ir传递回usran()感到困惑,因为这个功能子例程只返回 usran,它是 (0,1) 中的实数)。我想一种方法是在程序中调用 usran(seed) 之后计算 usran*dc 并将其用作新种子?