在不同计算机上产生不同的随机数序列

3

如果为随机数生成定义了种子数,那么不同的计算机可能会得到不同的随机数序列吗?如果是的话,如何实现获得相同的随机数序列?

    private static final long seed = 1;

    Random generator = new Random(seed);

    for (int i = 0; i < nchrom; i++) {
        val = (int) Math.round(generater.nextDouble()*(nchrom-1));
        //...
    }

3
好的,但重点在于我使用相同的SEED数。 - Klausos Klausos
1
这就是伪随机数生成器的原理。这些数字并不是真正的随机数,它们是使用确定性算法生成的,但根据种子的不同,生成的数字序列也会有所不同。由于我总是使用相同的种子,因此我期望始终获得相同的序列。 - Klausos Klausos
通常情况下,如果您使用相同的种子,则应该获得相同的序列。您在两个系统上使用相同的JRE版本吗? - isnot2bad
1个回答

8
是的,使用相同的种子应该会得到相同的数字序列。算法在文档中有详细说明:
这个类的一个实例用于生成伪随机数流。该类使用一个48位种子,该种子使用线性同余公式进行修改。(见Donald Knuth,《计算机编程艺术》,第2卷,第3.2.1节)。
如果使用相同的种子创建两个Random实例,并为每个实例制定相同的方法调用顺序,它们将生成并返回完全相同的数字序列。为了保证此属性,为Random类指定了特定的算法。Java实现必须使用此处所示的所有算法来对Random类进行操作,以确保Java代码的绝对可移植性。但是,Random类的子类可以使用其他算法,只要它们遵守所有方法的通用合同即可。
我的唯一担心是,如果您使用nextDouble(),您可能会遇到浮点单元差异的某些副作用。我怀疑您不会遇到这个问题,但这仍然是我的担忧。我建议您无论如何都使用nextInt:
val = generator.nextInt(nchrom); // Exclusive upper bound

谢谢,完美无缺。关于你的问题,我确定要用 nchrom - 1,否则 val 可能会大于我的数组大小。 - Klausos Klausos
1
@KlausosKlausos:啊 - 使用 Math.round 你可能是正确的... 但对于 nextInt 你需要 nchrom,因为它是一个不包括上限的数。不过我不确定使用 Math.round 能否一开始就给你一个均匀分布。 - Jon Skeet

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