为什么使用带有硬编码种子的Random总会产生相同的结果?

Java中的以下简单程序使用java.util.Random类,因此它始终显示“hello world”。 代码片段如下所示。

 package nomain; import java.util.Random; final public class J { public static String randomString(int seed) { Random rand = new Random(seed); StringBuilder sb = new StringBuilder(); for(int i=0;;i++) { int n=rand.nextInt(27); if (n==0) { break; } sb.append((char) ('`'+n)); } return sb.toString(); } public static void main(String args[]) { System.out.println(randomString(-229985452)+' '+randomString(-147909649)); } } 

令人惊讶的是,它总是显示“hello world”,即使使用Random类导致随机数生成,因此每次运行时应更改数字,相应的字符应相应更改,但始终只显示一个稳定的字符串,如上所述“hello world”。 为什么会这样?

答案是传入的参数。这用于为随机数生成器播种。

 Random rand = new Random(seed); 

PRNG并非真正随机 – 它们是确定性的,但旨在模拟随机性。 因此,它们被称为“伪随机数发生器”。

对于给定的种子,PRNG将始终生成相同的数字。 然后它可能使用其最后一个结果作为下一个值的输入,因此通过为PRNG播种已知值,您将始终生成已知的“随机”数字序列。

已知数字-229985452和-147909649是种子,其将导致该特定PRNG产生5个数字的序列,其可被解释为“你好”和“世界”。 如果您要更改这些数字,您将得到不同的5个字符序列,但只要种子保持不变,它们对于程序的每次运行都是相同的。