2010-03-10 82 views
0

鉴于我们开始调用具有负整数[种子]的函数ran2,它将产生一系列随机数。如果使用相同的种子,则可以精确地重新生成序列。随机数发生器函数ran2数字配方

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

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

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

+0

哪个ran2是这个? – 2010-03-10 23:16:32

+0

为什么不维护一堆模拟状态(特定的随机数字只是另一条信息),以便您更容易地回溯/恢复/暂停/重放? – dirkgently 2010-03-10 23:17:29

+0

@Igancio。 从数字食谱:科学计算的艺术。 http://www.nr.com/ Fortran版本。但我想这应该与程序的语言无关。 – floatingpoint 2010-03-10 23:27:27

回答

1

我同意上面的@ dirkgently的评论。虽然我并不熟悉ran2,但是基于this sample code,它看起来好像有几个有状态的部分(idum,idum2,iyiv)可以封装并存储。当你“暂停”你的模拟时,你可以保存这个状态,并在下次启动时将它重新写入ran2引擎。恢复状态信息应该把机器放回原来的位置,随机序列可以恢复。这可能需要对ran2代码本身进行一些修改,但不应该是难以折叠的更改。

+0

是的,正好。你必须保存和恢复声明为“静态”的所有东西(这意味着将它们移出文件全局变量并添加保存/恢复功能),但这将允许你从中断的地方获取序列。 – mtrw 2010-03-10 23:34:55