什么是随机种子?

时间:2014-04-17 07:44:48

标签: java random seed

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

来源:link

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());
    }
}

6 个答案:

答案 0 :(得分:7)

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

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

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

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

所以当你希望结果可以预测时,你给PRNG带来一些已知值 - 例如出于测试目的或确保每次你在游戏中运行1级时,敌人总是放在同一个(伪)随机位置 - 否则你不需要明确地传递种子。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

Random Seed on Wikipedia:

  

随机种子(或种子状态,或种子)是一个数字(或向量)   用于初始化伪随机数生成器。

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

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

答案 3 :(得分:1)

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

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

用于不同的输出。

答案 4 :(得分:0)

来自Random class

中的Java文档
  

使用单个长种子创建新的随机数生成器。种子是伪随机数生成器的内部状态的初始值,由方法next(int)维护。

     

调用new Random(seed)等同于:

     

随机rnd = new Random();    rnd.setSeed(种子);

因此,42是您示例中new Random()的种子

答案 5 :(得分:0)

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

调用new Random(seed)等同于:

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