2012-02-05 25 views
13

我需要生成一个受控序列的伪随机数,给定一个初始整数参数。为此,我使用标准Java Random类,由一个整数参数播种。我希望确保在可预见的未来(以及更多!),我将在系统(操作系统,但也包括Java/JDK版本)上生成相同的序列。跨系统和版本的Java伪随机数的重复性?

总结:请问Java的保证重复性/便携的它的伪随机数生成器跨实施版本?

注意:我已经问了the exact same question for Python。我自从将实现语言更改为Java,但出于其他原因。

+1

只要不重复使用多个线程中的同一个生成器,它应该没问题。现在不要让这个评论错误:生成器本身是线程安全的,但是如果你使用同一个生成器从不同的线程生成数字,你将无法始终如一地重现来自你的各个线程的调用在各种系统上订购(甚至不在同一系统上的各种运行中)。 – TacticalCoder 2012-02-05 19:13:54

+0

情况并非如此,但感谢提示。那么,准确地说,你可以使用适当的锁定机制在几个线程内复制相同的序列,但我同意你的问题。 – 2012-02-27 12:43:29

回答

14

是的。

javadoc说明:

这个类的一个实例是用于生成伪随机数流。该类使用48位种子,使用线性同余公式进行修改。 (参见高德纳,计算机程序设计,第2卷,第3.2.1节的艺术。)

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