РАНДУ - RANDU
РАНДУ[1] это линейный конгруэнтный генератор псевдослучайных чисел (LCG) Тип Парка – Миллера, который используется с 1960-х годов.[2] Он определяется повторение:
с начальным начальным номером, как нечетное число. Он генерирует псевдослучайные целые числа которые равномерно распределены в интервале [1, 231 − 1], но в практических приложениях часто отображаются в псевдослучайных рациональные в интервале (0, 1), по формуле:
- .
RANDU от IBM считается одним из самых непродуманных генераторов случайных чисел из когда-либо созданных.[3] и был описан как "поистине ужасный" Дональд Кнут.[4] Это не спектральный тест плохо для размеров больше 2, и каждый целочисленный результат нечетный. Однако при преобразовании в числа с плавающей запятой одинарной точности (32 бита, 24 бита мантисса) отбрасываются как минимум восемь младших битов.
Причина выбора этих конкретных значений заключается в том, что при 32-битном целочисленном размере слова арифметика mod 231 и расчеты могут быть выполнены быстро, используя специальные возможности некоторого компьютерного оборудования.
Проблемы с множителем и модулем
В общем, когда LCG с модулем 231 используется для получения точек (xk, Икск + 1, Икск + 2) в трехмерном пространстве точки попадают не более чем в 2344 параллельные плоскости,[5] результат, указывающий на непригодность LCG для Моделирование Монте-Карло. Выбор множителя определяет количество самолетов. Чтобы показать проблему со значениями множителя 65539 и модуля 231 выбранный для RANDU, рассмотрите следующий расчет, где каждый член должен быть взят по модулю 231. Начните с записи рекурсивного отношения как:
который становится после расширения квадратичного множителя:
- потому что 232 мод 231 = 0
и позволяет нам показать корреляцию между тремя точками как:
В результате такой корреляции каждая точка лежит в одной из множества параллельных плоскостей 2.31 друг от друга, 15 из которых пересекают 231 х 231 х 231 куб, содержащий точки. В результате широкого использования RANDU в начале 1970-х годов многие результаты того времени считаются подозрительными.[6]
Этот проступок был обнаружен еще в 1963 году.[7] на 36-битном компьютере и тщательно переопределил[требуется разъяснение ] на 32-битном IBM System / 360. Считалось, что к началу 1990-х годов он подвергся широкой чистке.[8] но компиляторы FORTRAN использовали его вплоть до 1999 года.[1]
Пример вывода
Начало периода вывода RANDU для начального семени является:
использованная литература
- ^ а б Справочное руководство по языку Compaq Fortran (номер для заказа: AA-Q66SD-TK), сентябрь 1999 г. (ранее DIGITAL Fortran и DEC Fortran 90)
- ^ Энтачер, Карл (июнь 2000 г.). «Сборник классических генераторов псевдослучайных чисел с линейными структурами - расширенная версия». Архивировано из оригинал 18 ноября 2018 г.
- ^ Кнут Д.Э. Искусство программирования, Том 2: Получисловые алгоритмы, Второе издание. Аддисон-Уэсли, 1981. ISBN 0-201-03822-6. Раздел 3.3.4, с. 104. «Самого его названия RANDU достаточно, чтобы вызвать смятение в глазах и желудках многих компьютерных ученых!» [Обширный охват статистических тестов на неслучайность.]
- ^ Knuth (1998), стр. 188
- ^ Марсалья, Джордж (1968). «Случайные числа выпадают в основном в плоскости». Proc. Natl. Акад. Sci. СОЕДИНЕННЫЕ ШТАТЫ АМЕРИКИ. 61 (1): 25–28. Дои:10.1073 / pnas.61.1.25. ЧВК 285899. PMID 16591687.
- ^ Press, William H .; и другие. (1992). Числовые рецепты в Fortran 77: искусство научных вычислений (2-е изд.). ISBN 0-521-43064-X.
- ^ исх. 7 из http://portal.acm.org/citation.cfm?id=363827
- ^ Интервью с Дональдом Кнутом