Почему использование 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));
    }
}

Существует некоторое удивление в том, что он всегда отображает "мир привет", даже если используется класс Random, который приводит к генерации случайных чисел, номера должны быть изменены в каждом прогоне, и соответствующие символы должны быть изменены соответствующим образом, но это всегда отображает только одну стабильную строку, которая упоминается выше "hello world". Почему это происходит?

Ответы

Ответ 1

Ответ - это передаваемый параметр. Используется для засева генератора случайных чисел.

Random rand = new Random(seed);

PRNG не являются действительно случайными - они детерминированы, но предназначены для имитации случайности. По этой причине их лучше назвать "генераторами псевдослучайных чисел".

Для данного семени PRNG всегда будет генерировать одинаковый номер. Затем он, вероятно, использует свой последний результат как вход для следующего значения, поэтому, высевая PRNG с известным значением, вы всегда будете генерировать известную последовательность "случайных" чисел.

Числа -229985452 и -147909649 известны как семена, которые приведут к тому, что конкретный PRNG приведет к последовательности из 5 чисел, которые могут быть интерпретированы как "привет" и "мир". Если бы вы изменили эти числа, вы бы получили разные 5-символьные последовательности, но они были бы одинаковыми для каждого запуска программы, если семя остается тем же самым.