使用种子可以获得一个Random对象,一遍又一遍地吐出相同的数字序列。但是,如果你想关闭你的应用程序,重新启动它并继续从你离开的地方吐出数字怎么办?简单地使用相同的种子启动一个新的Random会再次启动序列。
所以..除了维护所有对Random的调用列表然后重新调用它们以回到相同的位置之外,还有更好的方法吗?
编辑: Zim-Zam指出使用Java Serialization重新启动对象,但我不想将单个Java对象添加到我的保存文件中,否则这些文件完全是XML。
答案 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);
}