ЗАДАЧА
Мультипликативный датчик и плохие параметры.
РЕШЕНИЕ
Один из способов генерации псевдослучайных чисел - мультипликативный
датчик
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
суббота, 23 февраля 2008 г.
День восьмой (Неслучайные числа)
на
15:29
Подписаться на:
Комментарии к сообщению (Atom)

Комментариев нет:
Отправить комментарий