为什么Random(System.currentTimeMillis());给我重复的值(Java)?

时间:2018-09-28 20:04:28

标签: java

我是Java新手,需要创建两个随机数。我们被指示使用System.currentTimeMillis(),但是我不知道为什么我得到这么多重复的数字。

import java.util.Random;

public class TestClass1 {

    public static void main(String[] args) { 
        int points = 0;
        while (points < 100) {
        int[] scoreInfo = diceGen();
        System.out.println(scoreInfo[0]);
        System.out.println(scoreInfo[1]);
        points += 1;
        }
    }

    public static int[] diceGen() {
        Random num = new Random(System.currentTimeMillis());
        int dice1 = num.nextInt(6)+1;
        int dice2 = num.nextInt(6)+1;
        int[] numbers = {dice1, dice2};
        return numbers;     

    }


}

输出: 6 6 6 6 6 6 6 6 6 6 6 6 6 6 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 4 2 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 3 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 1个 4 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 2 6 5 6 5 6 5 6 5 6 5 6 5 6 5 6 5 6 5 6 5 6 5 6 5

3 个答案:

答案 0 :(得分:5)

Random()构造函数的参数是随机数生成器的种子。每次您使用相同的种子创建一个新的Random实例时,它都会生成相同的数字。由于diceGen()的执行时间不到一毫秒,因此您要创建多个具有相同毫秒数的实例。

相反,您需要创建一个Random实例并将其存储在字段中或将其作为参数传递。

答案 1 :(得分:2)

代码执行得足够快,以至于两次循环迭代之间,System.currentTimeMillis()返回的值保持不变。因此,这些Random实例是使用相同的种子创建的,并返回相同的值。

考虑使用System.nanoTime()或构造一个Random实例并在所有迭代中重复使用。

类似

public static void main(String[] args) {
    int points = 0;
    Random num = new Random(System.nanoTime());
    while (points < 100) {
        int[] scoreInfo = diceGen(num);
        System.out.println(scoreInfo[0] + ", " + scoreInfo[1]);
        points += 1;
    }
}

public static int[] diceGen(Random num) {
    int dice1 = num.nextInt(6) + 1;
    int dice2 = num.nextInt(6) + 1;
    int[] numbers = { dice1, dice2 };
    return numbers;
}

答案 2 :(得分:-1)

使rng成为全局范围。每次通话都会更改号码。如果您每次调用生成器时都为rng播种,则很有可能您将在相同的滴答声中调用该种子,从而获得相同的编号。

import java.util.Random;

public class TestClass1 {
static public Random num = new Random(System.currentTimeMillis());

public static void main(String[] args) { 
    int points = 0;
    while (points < 100) {
    int[] scoreInfo = diceGen();
    System.out.println(scoreInfo[0]);
    System.out.println(scoreInfo[1]);
    points += 1;
    }
}

public static int[] diceGen() {        
    int dice1 = num.nextInt(6)+1;
    int dice2 = num.nextInt(6)+1;
    int[] numbers = {dice1, dice2};
    return numbers;     

}


}

rngs的工作方式为x = trunc( old_x * big_prime ) + prime,在第一次调用时old_x是种子。