25

在 Java 中,我们有静态类 Math。您不需要创建它的对象,所以它是静态的。另一个是随机类。我们不需要创建它的实例,那为什么它也不是静态的呢?我的课程我经常使用随机数,当必须在每个课程中创​​建字段 rand 以生成随机数时,我会很生气。那么为什么不是静态的呢?

4

4 回答 4

30

Random 类具有状态,包括它在其序列中的位置,因为产生的值不是真正随机的,只是一个伪随机序列。

这可以通过用相同的种子初始化两个实例来证明。

Random a = new Random(123);
Random b = new Random(123);
for (int i = 0; i < 5; i++) {
    System.out.println(a.nextInt() + "," + b.nextInt());
}

输出

-1188957731,-1188957731
1018954901,1018954901
-39088943,-39088943
1295249578,1295249578
1087885590,1087885590

如果使用默认构造函数 Random() 创建,则种子会根据当前时间(以纳秒为单位)+ 静态计数器进行初始化,这意味着不同的实例很可能具有不同的序列。

于 2013-01-20T12:40:51.940 回答
14

确实需要创建实例,因为随机数生成器具有state。具体来说,是控制伪随机序列中当前位置的状态。

如果您想要多个独立的生成器(不共享状态),那么您需要单独的实例。

于 2013-01-20T12:40:24.013 回答
5

这都是关于种子的。如您所知,我们谈论的不是真正的随机数,而是伪随机数。当您知道第一个数字时,您可以计算其他数字。这就是为什么我们使用所谓的“种子”的原因。的每个对象Random都有不同的种子。如果Random是静态的,你就不能有两个不同的种子。请注意,该setSeed()方法将影响所有随机数生成器(我们通常只想更改一个)。

于 2013-01-20T12:42:02.127 回答
4

原因是您可能需要几个独立的随机数生成器。这是通过多个实例来实现的Random

于 2013-01-20T12:40:37.377 回答