下面的简单 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));
}
}
令人惊讶的是,即使使用 Random 类导致生成随机数,它也始终显示“hello world”,因此,每次运行时都应更改数字,并且相应的字符也应相应更改,但它始终仅显示一个稳定的字符串,如上所述“hello world”。为什么会发生这种情况?
答案是传入的参数。它用于为随机数生成器提供种子。
Random rand = new Random(seed);
PRNG 并不是真正随机的 - 它们是确定性的,但旨在模拟随机性。因此,它们更适合称为“伪随机数生成器”。
对于给定的种子,PRNG 将始终生成相同的数字。然后,它可能使用其最后的结果作为下一个值的输入,因此通过用已知值播种 PRNG,您将始终生成已知的“随机”数字序列。
已知数字 -229985452 和 -147909649 是种子,它们将导致特定的 PRNG 生成 5 个数字的序列,可以解释为“hello”和“world”。如果您要更改这些数字,您将获得不同的 5 字符序列,但只要种子保持不变,每次运行程序时它们都是相同的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)