Воспроизводимость Java псевдослучайных чисел в разных системах и версиях? - PullRequest
14 голосов
/ 05 февраля 2012

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

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

Примечание: я задал точно такой же вопрос для Python . С тех пор я изменил язык реализации на Java, но по другим причинам.

1 Ответ

15 голосов
/ 05 февраля 2012

Да.

javadoc объясняет:

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

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

...