This question already has answers here:
Why does this code using random strings print “hello world”?
(15个答案)
7年前关闭。
以下Java简单程序使用
令人惊讶的是,即使使用Random类会导致生成随机数,它也始终显示“hello world”,因此,每次运行都应更改数字,并相应地更改相应的字符,但始终仅显示如上所述的“hello world”一个稳定的字符串。为什么会发生?
PRNG并不是真正的随机性-它们是确定性的,但旨在模拟随机性。因此,它们被更好地称为“伪随机数生成器”。
对于给定的种子,PRNG将始终生成相同的数字。然后,它很可能会将其最后的结果用作下一个值的输入,因此,通过给PRNG注入(inject)已知值,您将始终产生已知的“随机”数字序列。
已知数字-229985452和-147909649是种子,它们将导致特定的PRNG生成5个数字的序列,这些序列可以解释为“hello”和“world”。如果要更改这些数字,则将获得不同的5个字符的序列,但是只要种子保持不变,它们在每次运行时都将是相同的。
(15个答案)
7年前关闭。
以下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注入(inject)已知值,您将始终产生已知的“随机”数字序列。
已知数字-229985452和-147909649是种子,它们将导致特定的PRNG生成5个数字的序列,这些序列可以解释为“hello”和“world”。如果要更改这些数字,则将获得不同的5个字符的序列,但是只要种子保持不变,它们在每次运行时都将是相同的。
关于java - 为什么将Random与硬编码的种子一起使用总是产生相同的结果? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8044570/
10-14 11:29