Why does the use of Random with a hardcoded seed a

2019-03-18 02:25发布

问题:

This question already has an answer here:

  • Why does this code using random strings print “hello world”? 14 answers

The following simple program in Java uses the java.util.Random class such that it always displays "hello world". The code snippet can be seen below.

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));
    }
}

There is some surprise in that it always displays "hello world" even if the Random class is used that causes the random numbers to generate hence, the numbers should be changed on each run and the corresponding characters should be changed accordingly but it always displays only one stable string which is as mentioned above "hello world". Why does it happen?

回答1:

The answer is the parameter that's being passed in. That's used to seed the random number generator.

Random rand = new Random(seed);

PRNGs are not truly random - they are deterministic, but are designed to simulate randomness. For this reason they are better termed "pseudo-random number generators".

For a given seed, a PRNG will always generate the same number. It then likely uses its last result as an input to the next value, so by seeding the PRNG with a known value, you will always produce a known sequence of "random" numbers.

The numbers -229985452 and -147909649 are known to be seeds which will cause that particular PRNG to produce a sequence of 5 numbers that can be interpreted as "hello" and "world". If you were to change those numbers, you would get different 5-character sequences, but they would be the same for every run of the program, so long as the seed remains the same.



标签: java random