【问题标题】:Random Number generator function ran2 Numerical Recipes随机数生成器函数 ran2 数值配方
【发布时间】:2010-03-10 23:12:54
【问题描述】:

假设我们以负整数 [种子] 开始调用函数 ran2,它将产生一系列随机数。如果使用相同的种子,则可以准确地重新生成序列。

现在我的问题是,有没有一种方法可以让我们直接进入序列中的某个点,然后从该点继续?例如,如果某个种子的随机数是 0.35、0.32、0.44、0.32、0.66、0.32、0.45。

如果我们知道产生这个序列的种子,有没有办法让函数返回 0.66,然后从那个点开始继续?

我想使用它的方式是在模拟中。因此,如果我的模拟在某个点结束并且我需要重新启动它,我应该继续使用相同的随机数序列。 谢谢。

【问题讨论】:

  • 为什么不维护一堆模拟状态(特定的随机数只是另一条信息),以便您更容易回溯/恢复/暂停/重播?
  • @Igancio。摘自《数值食谱:科学计算的艺术》一书。 nr.com Fortran 版本。但我想程序使用哪种语言并不重要。
  • @dirkgently:这将涉及节省太多输出。我说的是对函数的数千万次调用。因此,如果我们知道种子,如果能以直接的方式到达系列中的某个点,那就太好了。
  • 超过一定限制时序列化输出。仅在内存中保留一定数量的状态(上下文的局部性),这足以用于回溯并按需加载较早的状态。否则,

标签: math random generator simulation


【解决方案1】:

我同意@dirkgently 上面的评论。虽然我不熟悉ran2,但基于this sample code,看起来有一些有状态的部分(idumidum2iyiv)可以封装出来并存储。当您“暂停”您的模拟时,您可以保存此状态并在下次启动时将其写回ran2 引擎。恢复状态信息应该让机器回到它停止的地方,并且随机序列可以恢复。这可能需要对 ran2 代码本身进行一些修改,但应该不是很难融入的更改。

【讨论】:

  • 是的,完全正确。您必须保存和恢复声明为 static 的所有内容(这意味着将它们移出为文件全局变量并添加保存/恢复功能),但这将允许您从中断处继续。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 2015-03-14
  • 2015-12-17
相关资源
最近更新 更多