This question already has answers here:
Why does this code using random strings print “hello world”?

(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