【问题标题】:How to call PRNG using sequential seed values?如何使用顺序种子值调用 PRNG?
【发布时间】: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 并将其用作新种子?

标签: random fortran


【解决方案1】:

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

正如@francescalus 和@Vladmir F 评论的那样,这个函数有一个side-effect。来自维基百科:

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

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

Purity”过程在 Fortran 上下文中起着重要作用,因为副作用的可能性会阻止编译器进行一些代码优化。如果子程序唯一的副作用是修改特定参数,那么它仍然可以被认为是纯子程序。

但在某些情况下,由于程序的性质,副作用是无法避免的,有时甚至是需要的。收集随机数就是一个例子,还有做 I/O、停止代码或配置模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多