RANDU

Материал из testwiki
Перейти к навигации Перейти к поиску

Шаблон:Нет сносок

Распределение в трёхмерном пространстве 100 000 точек, полученных алгоритмом RANDU. Можно видеть, что точки расположены на 15 плоскостях.

RANDU — линейный конгруэнтный генератор псевдослучайных чисел, вошедший в употребление в 1960-х годах. Он определяется рекуррентным соотношением

Vj+1(65539Vj)mod231,

где V0 нечётное.

Псевдослучайные числа, равномерно распределены в диапазоне(периоде последовательности) [1, 231 − 1], но из-за короткого периода, данный алгоритм лучше использовать для генерации последовательностей из (0, 1), полученных посредством следующей формулы:

XjVj/231.

Популярно мнение, что данный алгоритм — один из наименее продуманных генераторов псевдослучайных чисел среди когда-либо предложенных, так как он не проходит спектральный тест при количестве измерений, превышающем 2[1][2].

Основанием для выбора параметров генератора послужило то, что в рамках целочисленной 32-битной машинной арифметики операции по модулю 231, в частности, умножение произвольного числа на 65539=216+3, выполняются эффективно. В то же время такой выбор обладает и принципиальным недостатком. Рассмотрим следующее выражение (будем полагать, что все операции выполняются по модулю 231):

xk+2=(216+3)xk+1=(216+3)2xk,

откуда, раскрыв квадратичный сомножитель, получаем

xk+2=(232+6216+9)xk=[6(216+3)9]xk,

что, в свою очередь, показывает наличие линейной зависимости (а следовательно, и полной корреляции) между тремя соседними элементами последовательности:

xk+2=6xk+19xk.

Как следствие корреляции, точки в трёхмерном пространстве, координаты которых получены по данному алгоритму, располагаются на сравнительно небольшом количестве плоскостей (в приведённом примере — на 15 плоскостях).[3]

Пример

Пример псевдослучайной последовательности, порождаемой алгоритмом RANDU при начальном значении V0=1:

            1
        65539
       393225
      1769499
      7077969
     26542323
     95552217
    334432395
   1146624417
   1722371299
     14608041
          ...
    134633675
   1893599841
   1559961379
    907304297
   2141591611
    388843697
    238606867
     79531577
    477211307
            1

Использование

Из-за широкого использования RANDU в начале 1970-х годов, полученные в это время результы могут находиться под подозрением[4]. Проблема была замечена уже в 1963[5] на 36-битном компьютере. Считалось, что к началу 1990-х алгоритм был выведен из употребления,[6] но ещё в 1999 году он использовался в некоторых компиляторах Фортрана[7].

Цитаты

Шаблон:Начало цитаты Само его название — RANDU (похоже на «random» — «случайный» — Прим. ред.), способно вызвать испуг в глазах и спазмы в желудке у многих учёных, специализирующихся на компьютерах![8] Шаблон:Oq Шаблон:Конец цитаты Шаблон:Начало цитаты Один из нас вспоминает, что получил однажды графическое изображение «случайной» последовательности, состоящее всего из 11 плоскостей. В ответ на это консультант вычислительного центра по программированию заявил, что генератор случайных чисел использовался неверно: «Мы гарантируем, что каждое число случайно само по себе, но не гарантируем, что случайно более чем одно из них». Попробуйте такое понять. Шаблон:Oq Шаблон:Конец цитаты

Примечания

Шаблон:Примечания

Дополнительная литература

Ссылки

  1. Шаблон:Cite web
  2. Шаблон:Cite web
  3. Шаблон:Статья
  4. Шаблон:Cite book
  5. Шаблон:Cite journal
  6. Шаблон:Cite web
  7. Compaq Fortran Language Reference Manual (Order Number: AA-Q66SD-TK) September 1999 (formerly DIGITAL Fortran and DEC Fortran 90).
  8. Шаблон:Книга