如何使用顺序种子值调用PRNG?

时间:2018-06-27 06:50:51

标签: random fortran

下面的代码来自于用Fortran 77编写的prng

    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)中的值,然后如何调用当前序列中的下一个值? / p>

我想不出该线程的更具体的标题。

1 个答案:

答案 0 :(得分:1)

  

我的意思是,如果我有一个初始随机值作为我的seed,请输入   usran(seed)返回(0,1)中的值,然后如何调用下一个值   按照当前顺序?

正如@francescalus和@Vladmir F所评论的,此函数具有side-effect。来自维基百科:

  

在计算机科学中,一个函数或表达式被认为具有一个方面   如果它修改了超出其范围的某些状态或具有   与调用函数或外界的可见交互   除了返回值。例如,特定功能可能   修改全局变量或静态变量,修改其之一   参数,引发异常,将数据写入显示或文件,读取   键盘或文件中的数据,或调用其他副作用   功能。在存在副作用的情况下,程序的行为可能   依靠历史;也就是说,评估的顺序很重要。   了解和调试具有副作用的功能需要   有关上下文及其可能的历史的知识。一种   没有副作用的功能或表达被认为是纯净的。

在函数的特定情况下,除了返回随机数之外,它还会使用ir=abs(mod(da*ir,db)+0.5d0)来更改其参数的值。因此,每次使用与参数相同的变量再次调用它时,ir都会传递一个不同的值,从而会生成一个不同的随机数。

过程的

Purity”在Fortran上下文中起着重要作用,因为副作用的可能性阻止了编译器进行一些代码优化。如果子例程的唯一副作用是修改特定参数,则仍可以将其视为纯例程。

但是,在某些情况下,由于该过程的本质,无法避免副作用,有时甚至是希望的。收集随机数就是一个例子,也可以进行I / O,停止代码或配置模块。