Java伪随机数在不同系统和版本间的可重复性?

15

我需要生成一串受控的伪随机数序列,给定一个初始整数参数。为此,我使用标准的Java Random类,由一个整数参数作为种子。我想确保在可预见的未来(甚至更长时间内),在不同系统(操作系统以及Java/JDK版本)上生成相同的序列。

总结:Java是否确保了其伪随机数生成器在不同的实现和版本之间具有可重现性/可移植性?

注意:我曾经问过完全相同的问题,但是关于Python。我现在改用Java来实现,原因是其他方面的考虑。


1
只要您不在多个线程中重复使用同一个生成器,就可以了。现在不要误解这个评论:生成器本身是线程安全的,但是如果您在使用相同的生成器从各个线程生成数字,则无法在各种系统上以完全相同的顺序一致地重现来自各个线程的调用(甚至在同一系统上的各种运行中也是如此)。 - TacticalCoder
那不会是问题,但感谢您的提示。准确地说,您可以使用适当的锁定机制在多个线程中重现相同的序列,但我同意您的观点,这样做会引发麻烦。 - Laurent Grégoire
1个回答

15

是的。

javadoc解释道:

此类的实例用于生成伪随机数流。该类使用48位种子,使用线性同余公式进行修改。(请参见Donald Knuth,《计算机程序设计艺术》,第2卷第3.2.1节.)

如果使用相同的种子创建两个Random实例,并且对每个实例进行相同的方法调用序列,则它们将生成并返回相同的数字序列。为了保证这个特性,特定的算法被指定给Random。Java实现必须使用这里显示的所有算法来实现Random类,以确保Java代码的绝对可移植性。但是,class Random的子类可以使用其他算法,只要它们遵守所有方法的一般契约即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接