2012-02-05 2 views
13

Мне нужно сгенерировать управляемую последовательность псевдослучайных чисел, учитывая начальный целочисленный параметр. Для этого я использую стандартный класс Java Random, засеянный целочисленным параметром. Я хотел бы убедиться, что в обозримом будущем я буду генерировать одну и ту же последовательность в разных системах (операционная система, а также версия Java/JDK) (и многое другое!).Воспроизводимость java псевдослучайных чисел в системах и версиях?

В итоге: Обеспечивает ли Java воспроизводимости/портативность это генератор псевдослучайных чисел по реализации и версии?

Примечание: я спросил the exact same question for Python. С тех пор я изменил язык реализации на Java, но по другим причинам.

+1

все должно быть в порядке, если вы не используете один и тот же генератор из нескольких потоков. Теперь не ошибитесь в этом комментарии: сам генератор является потокобезопасным, но если вы генерируете числа из разных потоков с использованием одного и того же генератора, вы не сможете последовательно воспроизводить вызовы из разных потоков в одном и том же порядок на разных системах (даже на разных прогонах в одной системе). – TacticalCoder

+0

Это не так, но спасибо за подсказку. Ну, если быть точным, вы можете воспроизвести одну и ту же последовательность в нескольких потоках с использованием правильного механизма блокировки, но я согласен с вами в том, что вы просите о неприятностях. –

ответ

14

Да.

javadoc объясняет:

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

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

Смежные вопросы