Java 为什么对硬编码种子使用Random总是产生相同的结果?

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简单程序使用
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字符序列,但只要种子保持不变,程序每次运行时它们都是相同的。

这可能与随机数生成器是确定性的这一事实有关。。。也就是说,如果使用相同的种子值,那么每次都会生成相同的序列。但我不能肯定,这个问题不是那个问题的翻版。这个问题与这个问题相反。