我是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
答案 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是种子。