Java:Can(new Random()).nextInt(5)总是返回相同的数字?

ser*_*erg 4 java random

有时这段代码总是返回相同的数字(有时它工作正常):

(new Random()).nextInt(5)
Run Code Online (Sandbox Code Playgroud)

我怀疑问题在哪里 - 它可能总是创建一个具有相同种子的新Random.那么什么是最好的解决方案:

  • 为Random()创建一个静态var并改为使用它.
  • 使用Math.random()*5(看起来它在内部使用静态var)

或者是其他东西?我不需要任何看似随意的东西.

如果有人能够解释为什么原始代码有时会起作用而有时却不能解释,那将会很有帮助.

谢谢.

ska*_*man 12

java.util.Random的javadoc是明确的:

如果使用相同的种子创建两个Random实例,并且对每个实例都进行相同的方法调用序列,则它们将生成并返回相同的数字序列.

默认构造函数也很清楚:

创建一个新的随机数生成器.此构造函数将随机数生成器的种子设置为非常可能与此构造函数的任何其他调用不同的值.

换句话说,没有保证.

如果您需要更随机的算法,请使用java.security.SecureRandom.

  • 简单地创建一个(并且只有一个)Random()实例将解决所有随机性问题. (7认同)
  • 如果您创建多个SecureRandom实例,您将损害它提供随机数的能力,就像随机数一样多. (2认同)

Bil*_*ard 7

如果你在连续的行上调用那行代码,那么是的,你创建的两个Random实例可以用来自时钟的相同种子创建(时钟毫秒刻度计数是Random对象的默认种子).几乎普遍地,如果应用程序需要多个随机数,您将创建一个Random实例并根据需要重复使用它.

编辑:有趣的是,自1.4.2以来,随机javadoc已经改变,这解释了时钟被用作默认种子.显然,这不再是一种保证.

编辑#2:顺便说一下,即使你重复使用正确播种的随机实例,你仍然可以获得与前一次通话相同的随机数,大约是你打电话时的1/5 nextInt(5).

public static void main(String[] args) {
    Random rand = new Random();
    int count = 0;
    int trials = 10000;

    int current;
    int previous = rand.nextInt(5);

    for(int i=0; i < trials; ++i)
    {
        current = rand.nextInt(5);

        if( current == previous )
        {
            count++;
        }
    }

    System.out.println("Random int was the same as previous " + count +
                       " times out of " + trials + " tries.");
}
Run Code Online (Sandbox Code Playgroud)


Osc*_*Ryz 6

...有时这段代码[..]会返回相同的数字(有时它可以正常工作)......

所以它随机工作??? :) :) :) :)

好吧,好吧,现在就投票给我!