下面展示一段基于固定种子的随机数生成程序:

text
public static void main(String[] args) {
System.out.println(randomString(-229985452) + “ “ + randomString(-147909649));
}

public static String randomString(int seed) {
Random ran = new Random(seed);
StringBuilder sb = new StringBuilder();
while (true) {
int k = ran.nextInt(27);
if (k == 0) {
break;
}
sb.append((char) (‘`’ + k));
}
return sb.toString();
}
该程序每次运行都会输出:hello world,原因何在?

在Java中,Random构造函数的seed参数用于设定随机数生成的初始种子。相同的种子会产生完全相同的随机数序列,因此无论执行多少次,生成的随机序列都是一致的。

使用种子 -229985452 构造Random对象时,会产生以下5个非零随机数:

text
8
5
12
12
15
使用种子 -147909649 构造Random对象时,则产生:

text
23
15
18
12
4
程序中通过 ‘`` + k 将数字转换为字符,其中 ```` 的ASCII码为96,因此计算过程如下:

text
8 + 96 = 104 –> h
5 + 96 = 101 –> e
12 + 96 = 108 –> l
12 + 96 = 108 –> l
15 + 96 = 111 –> o

23 + 96 = 119 –> w
15 + 96 = 111 –> o
18 + 96 = 114 –> r
12 + 96 = 108 –> l
4 + 96 = 100 –> d
这段看似简单的代码背后蕴含了伪随机数生成的确定性特征,你不妨用它来考考身边的开发伙伴。