суббота, 23 февраля 2008 г.

День восьмой (Неслучайные числа)

ЗАДАЧА
Мультипликативный датчик и плохие параметры.

РЕШЕНИЕ
Один из способов генерации псевдослучайных чисел - мультипликативный датчик

rndvec <- function(len, m, d) {
  k <- 1
  vec <- vector()
  for (i in 1:len) {
     k <- (k * m) %% d
     vec[i] <- k/d 
  }
  vec
}
при m == 2^16 + 3, d == 2^31 даёт следующее распределение на кубе:
> vs <- rndvec(9999, 2^16 + 3, 2^31)
> x <- vs[vs %% 3 == 0]
> y <- vs[vs %% 3 == 1]
> z <- vs[vs %% 3 == 2]
> library(rgl)
> plot3d(x, y, z)
казалось бы, случайное и равномерное... Но если взглянуть на куб под другим углом: Тройки vs[3*i], vs[3*i + 1], vs[3*i + 2] образуют параллельные плоскости. Ни о какой случайности речи быть не может.

ВЫВОД
Несмотря на интуитивно понятную ушербность ("почти кратность" параметров), именно с такими параметрами датчик в своё время попал в одну из библиотек для IBM-360. Исторический факт.

БОНУС
Из картинок подобного рода сразу вспоминается исследование случайности ISN, для различных ОС. newtcp и oldtcp

Комментариев нет: