为什么Random类不是静态的?

Mic*_*bor 23 java random

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

Ada*_*dam 27

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());
}
Run Code Online (Sandbox Code Playgroud)

产量

-1188957731,-1188957731
1018954901,1018954901
-39088943,-39088943
1295249578,1295249578
1087885590,1087885590
Run Code Online (Sandbox Code Playgroud)

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

  • *如果使用默认构造函数Random()创建,则使用当前时间(以毫秒为单位)初始化种子* - 这是不正确的,即使对于默认的`new Random()`,种子也比仅仅系统更复杂.的currentTimeMillis()` (2认同)

Oli*_*rth 13

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

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


NPE*_*NPE 5

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


Ada*_*der 5

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