Java Random对象可以在同一种子的不同执行中给出不同的结果吗?

时间:2016-09-11 19:18:03

标签: java random seed

假设您有一个使用Random对象的Java代码,使用常量种子进行初始化。在您的代码中,您使用Random对象生成不同的伪随机整数。您没有使用多线程。在不同的代码执行中是否可能有不同的结果?例如,如果Java编译器以某种随机方式删除Random对象的任何冗余调用以优化代码,则每次重新编译代码时执行都会有所不同。

4 个答案:

答案 0 :(得分:2)

理论上,不同的JVM可以对伪随机算法使用不同的实现。不同的JVM版本也可以这样做,因为它不需要在任何地方指定它需要为不同版本之间的给定种子返回相同的值。但据我所知,Oracle JDK中的Random实现自成立以来就一直如此。

在相同的执行环境下,输出得到保证。

答案 1 :(得分:1)

不,这几乎是guaranteed,假设两次运行之间有相同的环境。

  

可以使用种子状态从任意初始状态开始PRNG。当用该状态初始化时,它将始终产生相同的序列

感谢上帝,优化者从不改变任何事情,直接影响副作用。

如果它删除了死代码,那么因为代码在程序的每个可能状态下都被认为是死的,所以对Random的调用序列没有可能的影响。

答案 2 :(得分:0)

我认为,鉴于您在同一系统上使用相同的JVM,它应该是一致的。我刚刚尝试了以下内容。

import java.util.Random;

public class test
{
    public static void main(String[] args)
    {
        Random r = new Random(123);
        System.out.println(r.nextInt());
    }
}

每次在我的机器上运行它时都会输出相同的输出。我在Ubuntu 16.04上使用Open JDK 1.8.0_91。运行此代码时获得的值是-1188957731。为什么不尝试运行它,看看你是否得到相同的值。

答案 3 :(得分:0)

除非你引入任何其他熵源(例如使用输入或某种方式环境会影响程序),否则相同的随机种子将在每次执行时产生相同的结果。

请注意,这依赖于执行相同的字节代码。从理论上讲,更改编译器以编译相同的源代码可能会产生不同的字节代码,从而产生不同的输出,但要找到一个真实的例子来证明这一点很难。