1

使用种子,您可以获得一个 Random 对象,以一遍又一遍地吐出相同的数字序列。但是如果你想关闭你的应用程序,重新启动它并继续从你停止的地方吐出数字呢?只需使用相同的种子启动一个新的 Random 即可再次启动序列。

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

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

4

3 回答 3

2

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

或者,将 Java Random 源代码复制粘贴到您自己的MyRandom生成器中;这将使您可以访问生成器的内部工作,以便您可以保存和恢复其状态。

于 2013-05-02T20:17:32.670 回答
1

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

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

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

于 2013-05-02T20:46:25.533 回答
0

或者,如果您不喜欢序列化或重写一个相当复杂的类,为什么不:

Random mySaveableRandom = new Random();

long bookmark() {
    long bookmark = mySaveableRandom.nextLong();
    mySaveableRandom.setSeed(bookmark);
    return bookmark;
}
...
void startFrom(long bookmark) {
    mySaveableRandom.setSeed(bookmark);
}
于 2017-03-10T05:01:43.607 回答