使用种子,您可以获得一个 Random 对象,以一遍又一遍地吐出相同的数字序列。但是如果你想关闭你的应用程序,重新启动它并继续从你停止的地方吐出数字呢?只需使用相同的种子启动一个新的 Random 即可再次启动序列。
所以.. 除了维护对 Random 进行的所有调用的列表,然后重新调用它们以返回相同的位置,还有更好的方法吗?
编辑:Zim-Zam 已经指出使用 Java 序列化来重新启动对象,但我不想将单个 Java 对象添加到我的保存文件中,否则这些文件完全是 XML。
您可以序列化您的Random
对象ObjectOutputStream
以保存其状态;当您再次启动程序时,将其反序列化,ObjectInputStream
然后您Random
将从停止的地方开始。
或者,将 Java Random 源代码复制粘贴到您自己的MyRandom
生成器中;这将使您可以访问生成器的内部工作,以便您可以保存和恢复其状态。
好的。我相信我已经找到了一个经得起一些测试的解决方案。
扩展 Random 使您可以访问受保护的方法 next(int)。使用此步骤随机位置。因此,通过覆盖 nextFloat/nextInt/etc 方法并增加一个计数器。我可以使用相同的种子和计数启动一个新的 Random 对象,并调用 next() 足够的时间来赶上前一个实例。似乎运作良好,是一个很好的简单解决方案。
感谢那些回答/评论的人。
或者,如果您不喜欢序列化或重写一个相当复杂的类,为什么不:
Random mySaveableRandom = new Random();
long bookmark() {
long bookmark = mySaveableRandom.nextLong();
mySaveableRandom.setSeed(bookmark);
return bookmark;
}
...
void startFrom(long bookmark) {
mySaveableRandom.setSeed(bookmark);
}