Различные последовательности случайных чисел на разных компьютерах

Если для генерации случайных чисел определено начальное число, возможно ли, что разные последовательности случайных чисел будут получены на разных компьютерах? Если да, то как добиться одинаковых последовательностей?

    private static final long seed = 1;

    Random generator = new Random(seed);

    for (int i = 0; i < nchrom; i++) {
        val = (int) Math.round(generater.nextDouble()*(nchrom-1));
        //...
    }

person Klausos Klausos    schedule 02.12.2013    source источник
comment
Да, но дело в том, что я использую тот же номер SEED.   -  person Klausos Klausos    schedule 02.12.2013
comment
Это принцип псевдо-ГСЧ. Цифры на самом деле не случайны. Они генерируются с использованием детерминированного алгоритма, но в зависимости от начального числа последовательность генерируемых чисел различается. Поскольку я всегда использую одно и то же семя, я ожидаю, что всегда буду получать одну и ту же последовательность.   -  person Klausos Klausos    schedule 02.12.2013
comment
Обычно вы должны получить ту же последовательность, если используете одно и то же семя. Вы используете одну и ту же версию JRE в обеих системах?   -  person isnot2bad    schedule 02.12.2013


Ответы (1)


Да, с одним и тем же начальным числом вы должны получить одинаковую последовательность чисел. Алгоритм указан в документации:

Экземпляр этого класса используется для генерации потока псевдослучайных чисел. Класс использует 48-битное начальное число, которое модифицируется с помощью линейной конгруэнтной формулы. (См. Дональд Кнут, Искусство компьютерного программирования, том 2, раздел 3.2.1.)

Если два экземпляра Random создаются с одним и тем же начальным числом и для каждого из них выполняется одинаковая последовательность вызовов методов, они будут генерировать и возвращать идентичные последовательности чисел. Чтобы гарантировать это свойство, для класса Random указываются определенные алгоритмы. Реализации Java должны использовать все показанные здесь алгоритмы для класса Random ради абсолютной переносимости кода Java. Однако подклассам класса Random разрешено использовать другие алгоритмы, если они придерживаются общих контрактов для всех методов.

Единственное, что меня беспокоит, это то, что если вы используете nextDouble(), вы можете столкнуться с некоторыми артефактами различий в единицах измерения с плавающей запятой. Я подозреваю, что вы не будете, но это было бы моей заботой. Я бы рекомендовал вам использовать nextInt в любом случае:

val = generator.nextInt(nchrom); // Exclusive upper bound
person Jon Skeet    schedule 02.12.2013
comment
Спасибо, отлично. Что касается вашего вопроса, да, я уверен в nchrom - 1, иначе val может быть >, чем размер моего массива. - person Klausos Klausos; 02.12.2013
comment
@KlausosKlausos: Ах, используя Math.round, вы, вероятно, правы ... но для nextInt вам нужно nchrom, так как это эксклюзивная верхняя граница. Я не уверен, что использование Math.round дало бы вам равномерное распределение для начала. - person Jon Skeet; 02.12.2013