всякий, кто питает слабость
к арифметическим методам
получения случайных чисел,
грешен вне всяких сомнений
Джон фон Нейман
Некоторое время назад мне вдруг заинтересовала тема генерации случайных чисел. Уже не вспомню, что явилось причиной, однако я с удивлением обнаружил очень простой и интересный запаздывающий генератор Фибоначчи.
Подобные генераторы вычислительно эффективны, но требовательны к памяти. Однако память сейчас очень дешева и доступна, так что это не проблема.
Красивая идея, красивая реализация. Но на самом деле выясняется, что генераторы Фибоначчи на основе сложения выдают не очень хорошие случайные числа. А вот генераторы на основе умножения просто идеальны. Правда, они всегда генерируют только нечетные числа, поэтому требуют дополнительной, в принципе,очень простой, обработки перед использованием.
Я же попробовал обойти недостатки генератора на основе сложения использованием вот такого составного генератора
Xi = Fib1i⊕*Fib2i⊕+Fib3i⊕.
Как мне кажется, такое сочетание трех независимых генераторов Фибоначчи в духе ЛКГ должно сделать его статистические свойства более хорошими. Одно время было желание затестировать его на самые распространенные ошибки, но не осилил методику 😊. Также у подобного генератора просто огромный период, равный P(Fib1⊕)*P(Fib2⊕)*P(Fib3⊕).
У таких генераторов есть особенность. Их нужно как-то предварительно инициализировать, от качества инициализации зависит и качество генерируемых случайных чисел. Сложность состоит в том, что таких чисел надо достаточно много, в зависимости от параметров запаздывания генератора. Однако если следовать достаточно простым правилам, то подобные генераторы гарантированно после прогона будут выдавать хорошие псевдослучайные последовательности.
В случае генератора на основе сложения необходимо, что бы хотя бы одно число было нечетным. В случае генератора на основе умножения нужно что бы все числа были нечетны, и хотя бы одно больше единицы.
Если же инициализировать буфер генератора псевдослучайными числами с учетом вышеописанных ограничений, то генератор Фибоначчи сразу будет выдавать хорошие результаты.
Сделал генератор, потестил ну и ради смеха сделал к нему web-интерфейс. Бывает, нужно что-то случайное получить, писать каждый раз лень, так что пусть лежит, пару раз уже пригождался.
Ну и по поводу начальной цитаты. Хочу заметить, что те, кто питает слабость к аппаратным методам генерации случайных чисел, грешны не менее. Читал критическую статейку про аппаратный генератор, встроенный в современные процессоры Intel. Масса нюансов и нет гарантии, что он абсолютно точно не имеет каких-то статических значимых паразитных зависимостей.
Одним из идеальных генераторов случайных чисел на текущий момент считается построенный на основе датчиков радиоактивного распада. Однако же не выясниться ли в дальнейшем, что и на нем могут образовываться неслучайные зависимости от каких-либо глобальных процессов, происходящих в далеком космосе? Ведь вроде как по современным квантовым представлениям при перемещении условной частицы из точки А в точку Б она на самом деле проходит по всем возможным траекториям во всей вселенной...
Псевдослучайный же генератор хорош тем, что при желании его всегда может изучить и удостовериться, насколько он хорошо подходит для того или иного применения.
Комментариев нет:
Отправить комментарий