例如下面的代码.它有一个随机类.然而,它总是在各处产生相同的输出.在这种情况下哪个项目是种子?
来源:链接
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)
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级时,敌人总是置于同一(伪)随机地方 - 否则你不需要明确地传递种子.