为什么带有随机字符串的代码会输出“hello world”?
大家好!我是Java新手,偶然发现了一个奇怪的行为。我写了这样的代码:
```java
Random random = new Random(-229985452);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5; i++) {
sb.append((char) ('a' + random.nextInt(26)));
}
System.out.println(sb.toString()); // 输出“hello”
Random random2 = new Random(-147909649);
StringBuilder sb2 = new StringBuilder();
for (int i = 0; i < 5; i++) {
sb2.append((char) ('a' + random2.nextInt(26)));
}
System.out.println(sb2.toString()); // 输出“world”
```
我原本期望每次运行时都会输出随机字符串。但这段代码在不同机器上稳定地打印出“hello”和“world”。为什么会这样?这是某种魔法还是Java的特性?我多次重新启动程序——结果总是相同的。请解释一下这是如何工作的。提前谢谢!
<<>>
简短回答:随机数生成器的种子(seed)
类 java.util.Random 使用一个种子来初始化其伪随机数序列。当使用相同的种子时,生成的随机数序列是确定性的。这里使用的种子值(-229985452 和 -147909649)经过精心选择,使得前五个随机数恰好对应字母“hello”和“world”的偏移量。因此,无论运行多少次或在哪台机器上,只要使用相同的种子,结果都是固定的。这不是魔法,而是伪随机数生成器的确定性行为。