为什么使用带有硬编码种子的Random会产生相同的结果?

时间:2011-11-08 00:30:45

标签: 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 = 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”。为什么会这样?

1 个答案:

答案 0 :(得分:26)

答案是传入的参数。用于播种随机数生成器。

Random rand = new Random(seed);

PRNG并非真正随机 - 它们是确定性的,但旨在模拟随机性。出于这个原因,他们被称为"伪随机数生成器"。

对于给定的种子,PRNG将始终生成相同的数字。然后它可能使用它的最后一个结果作为下一个值的输入,因此通过为PRNG播种一个已知值,你将始终产生一个已知的序列" random"号。

已知数字-229985452和-147909649是种子,这将导致特定PRNG产生5个数字的序列,可以解释为"你好"和"世界"。如果您要更改这些数字,您将获得不同的5个字符序列,但只要种子保持不变,它们对于程序的每次运行都是相同的。