下面的代码来自于用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>
我想不出该线程的更具体的标题。
答案 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,停止代码或配置模块。