什么是随机种子?

new*_*mer 3 java random seed

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

来源:链接

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

Raf*_*ele 7

42是种子,正如Javadoc所说的那样.那么,什么是种子?一个随机数是很少真正随机的-通常这是一个伪随机代替.这意味着它是从一个函数生成的,即PRNG(伪随机数生成器).反过来,从函数生成意味着输出不再是随机的,因为它是可预测的!

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

我们如何描述PRNG,就像用过的那样Math.random()?它是一个函数,用种子 S 初始化,返回一个值数组A.注意,对于每个整数S,定义一个且只有一个数组A.例如(值不是实际的):

                first call     second call     third call
seed: 14329            .18             .82             .5
seed:  3989             .7             .02            .93
Run Code Online (Sandbox Code Playgroud)

因此,当您希望其结果可预测时,您可以为PRNG提供一些已知值 - 例如出于测试目的或确保每次在游戏中运行1级时,敌人总是置于同一(伪)随机地方 - 否则你不需要明确地传递种子.


Cod*_*dor 2

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