Java 为什么对硬编码种子使用Random总是产生相同的结果?
下面的Java简单程序使用Java 为什么对硬编码种子使用Random总是产生相同的结果?,java,random,Java,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 =
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个数字组成的序列,可以解释为“hello”和“world”。如果要更改这些数字,您将获得不同的5字符序列,但只要种子保持不变,程序每次运行时它们都是相同的。这可能与随机数生成器是确定性的这一事实有关。。。也就是说,如果使用相同的种子值,那么每次都会生成相同的序列。但我不能肯定,这个问题不是那个问题的翻版。这个问题与这个问题相反。