RANDU [1] — линейный конгруэнтный генератор псевдослучайных чисел (LCG) типа Парка–Миллера , который использовался в основном в 1960-х и 1970-х годах. [2] Он определяется рекуррентностью
с начальным числом семян как нечетным числом . Он генерирует псевдослучайные целые числа , которые равномерно распределены в интервале [1, 2 31 − 1] , но в практических приложениях часто отображаются в псевдослучайные рациональные числа в интервале (0, 1) по формуле
RANDU от IBM широко считается одним из самых непродуманных генераторов случайных чисел, когда-либо созданных, [3] и был описан Дональдом Кнутом как «по-настоящему ужасный» . [4] Он полностью проваливает спектральный тест для размерностей больше 2, как показано ниже.
Причина выбора именно этих значений для множителя и модуля заключалась в том, что при размере слова в 32 бита целые числа арифметика mod 2 31 и вычисления могли выполняться быстро, используя побитовые операторы в аппаратном обеспечении, но значения были выбраны для удобства вычислений, а не для статистического качества.
Для любого линейного конгруэнтного генератора с модулем m, используемого для генерации точек в n -мерном пространстве, точки попадают не более чем в параллельные гиперплоскости. [5] Это указывает на то, что низкомодульные LCG не подходят для высокоразмерного моделирования Монте-Карло . Для m = 2 31 и n = 3 LCG может иметь до 2344 плоскостей, теоретический максимум. Гораздо более узкая верхняя граница доказана в той же статье Марсальи как сумма абсолютных значений всех коэффициентов гиперплоскостей в стандартной форме. То есть, если гиперплоскости имеют вид Ax 1 + Bx 2 + Cx 3 = некоторое целое число, такое как 0, 1, 2 и т. д., то максимальное количество плоскостей равно | A | + | B | + | C |. [5]
Теперь рассмотрим значения множителя 65539 и модуля 2 31, выбранные для RANDU. Рассмотрим следующее вычисление, где каждый член должен быть взят по модулю 2 31. Начнем с записи рекурсивного соотношения в виде
который после расширения квадратичного множителя становится
(потому что 2 32 mod 2 31 = 0 ) и позволяет нам показать корреляцию между тремя точками как
Суммируя абсолютные значения коэффициентов, мы получаем не более 16 плоскостей в 3D, становясь всего лишь 15 плоскостями при более близком рассмотрении, как показано на диаграмме выше. Даже по стандартам LCGs это показывает, что RANDU ужасен: использование RANDU для выборки единичного куба приведет к выборке только 15 параллельных плоскостей, что даже близко не соответствует верхнему пределу плоскостей.
В результате широкого использования RANDU в начале 1970-х годов многие результаты того времени рассматриваются как подозрительные. [6] Это неправильное поведение уже было обнаружено в 1963 году [7] на 36-битном компьютере и тщательно переработано [ требуется разъяснение ] на 32-битной IBM System/360 . Считалось, что оно было широко уничтожено к началу 1990-х годов [8], но компиляторы FORTRAN все еще использовали его вплоть до 1999 года. [1]
Начало периода вывода RANDU для начального семени :