关于Java:什么是随机种子?

What is random seed about?

例如下面的代码。它有一个随机类。然而,它总是在任何地方产生相同的输出。在这种情况下,哪个项目是种子?

资料来源:链接

1
2
3
4
5
6
7
8
9
10
11
12
import java.util.Random;
public class RandomTest {
    public static void main(String[] s) {
        Random rnd1 = new Random(42);
        Random rnd2 = new Random(42);

        System.out.println(rnd1.nextInt(100)+" -"+rnd2.nextInt(100));
        System.out.println(rnd1.nextInt()+" -"+rnd2.nextInt());
        System.out.println(rnd1.nextDouble()+" -"+rnd2.nextDouble());
        System.out.println(rnd1.nextLong()+" -"+rnd2.nextLong());
    }
}


42是种子,正如雅瓦多所说。那么,什么是种子?随机数很少是真正随机的-通常是伪随机的。这意味着它是由一个函数生成的,称为prng(伪随机数生成器)。反过来,由函数生成意味着输出不再是随机的,因为它是可预测的!

然而,根据你的需要,这种伪随机性可能就足够了——我说的够多了,因为生成随机位很昂贵,我不是在谈论时间或记忆,而是关于金钱(见维基百科上的链接)。因此,例如,如果你需要一个随机值来放置敌人在你的游戏中,一个伪随机数是可以的-但是如果你正在构建与安全相关的软件,你想要使用一个真正的随机数,或者至少是一个加密安全的prng。

我们如何描述一个prng,比如Math.random()中使用的prng?它是一个函数,用种子s初始化,返回一个值数组a。请注意,对于每个整数s,只定义了一个数组a。例如(值不是实际值):

1
2
3
                first call     second call     third call
seed: 14329            .18             .82             .5
seed:  3989             .7             .02            .93

因此,当你希望它的结果是可预测的(例如为了测试目的或者为了确保每次你在游戏中运行1级时,敌人总是被放置在相同的(伪)随机位置)时,你就用一些已知的值给你的prng植入种子,否则你不需要明确地传递种子。


维基百科上的随机种子:

A random seed (or seed state, or just seed) is a number (or vector)
used to initialize a pseudorandom number generator.

换句话说,它是一个似乎是随机序列的数字。因此,如果使用相同的数字,则序列将始终相同。

在实践中,我们通常使用系统时间作为种子。


种子作为Random的构造函数的参数;使用相同的种子将产生相同的数字序列。然而,这是在这个问题的链接下讨论的。


在这种情况下,种子是42。这就是相同输出的原因——您使用相同的种子。例如,您可以使用

1
  Random rnd1 = new Random(System.currentTimeMillis())

对于不同的输出。


种子是由next(int)方法维护的伪随机数生成器内部状态的初始值。

调用new random(seed)等价于:

1
2
 Random rnd = new Random();
 rnd.setSeed(seed);

从随机类中的Java文档

Creates a new random number generator using a single long seed. The seed is the initial value of the internal state of the pseudorandom number generator which is maintained by method next(int).

The invocation new Random(seed) is equivalent to:

Random rnd = new Random();
rnd.setSeed(seed);

在你的例子中,42是给予new Random()的种子吗?