我试图理解Random()构造函数。我明白,如果我的代码如下:
Random rand = new Random(47);
System.out.println(rand.nextInt(10));
然后rand.nextInt(10)将生成一个0到9之间的随机数,但47传递给Random()构造函数的是什么呢?我发现了一些关于Random作为一个类的wiki,但没有任何关于构造函数如何为我工作的。非常感谢。
答案 0 :(得分:2)
Random
构造函数参数是内部伪随机数生成器的种子或起点。如果使用相同的种子构造两个Random
个对象,它们将生成相同的伪随机数序列。
要解决此问题,请构造传递new Date().getTime()
作为参数的Random对象。这将确保您每次都获得不同的序列(当代码执行间隔超过1毫秒时)。
答案 1 :(得分:1)
尝试一遍又一遍地运行程序。每次都会得到相同的输出,直到你将47改为其他东西,然后每次运行时都得到不同的结果。
为什么需要随机种子?计算机从复杂的数学运算中生成随机数,使结果看起来是随机的。
以下是Random的工作原理:
class Random {
int seed;
// initial condition of the random number generator
public Random(int seed) { this.seed = seed; }
public int nextInt(int range) {
// some complicated formula to find out the next number
int nextNumber = ... seed ... ;
// update state of random number generator
seed = nextNumber;
return nextNumber % range;
}
}
另见:
答案 2 :(得分:0)
种子的使用是对随机数序列的更多控制。具有相同种子的不同随机实例将产生相同的随机序列。 种子每次都可以不同,以产生不同的序列