使用相同的种子启动第二个Random对象

时间:2013-05-02 20:13:03

标签: java random seeding

使用种子可以获得一个Random对象,一遍又一遍地吐出相同的数字序列。但是,如果你想关闭你的应用程序,重新启动它并继续从你离开的地方吐出数字怎么办?简单地使用相同的种子启动一个新的Random会再次启动序列。

所以..除了维护所有对Random的调用列表然后重新调用它们以回到相同的位置之外,还有更好的方法吗?

编辑: Zim-Zam指出使用Java Serialization重新启动对象,但我不想将单个Java对象添加到我的保存文件中,否则这些文件完全是XML。

3 个答案:

答案 0 :(得分:2)

您可以使用Random序列化ObjectOutputStream对象以保存其状态;当您再次启动程序时,请使用ObjectInputStream对其进行反序列化,然后Random将从停止的位置开始。

或者,copy-paste the Java Random source code加入您自己的MyRandom生成器;这将使您可以访问生成器的内部工作,以便您可以保存和恢复其状态。

答案 1 :(得分:1)

好。我相信我找到了一个经得起一些测试的解决方案。

Extending Random使您可以访问受保护的方法next(int)。使用此步骤随机位置。因此,通过重写nextFloat / nextInt / etc方法并递增计数器。我可以使用相同的种子和计数启动一个新的Random对象,并调用next()足够的时间来赶上前一个实例。似乎运作良好,是一个很好的简单解决方案。

感谢那些回答/评论的人。

答案 2 :(得分:0)

或者,如果您不喜欢序列化或覆盖相当复杂的类,为什么不:

Random mySaveableRandom = new Random();

long bookmark() {
    long bookmark = mySaveableRandom.nextLong();
    mySaveableRandom.setSeed(bookmark);
    return bookmark;
}
...
void startFrom(long bookmark) {
    mySaveableRandom.setSeed(bookmark);
}