Хабрахабр

[Перевод] Генерирование псевдослучайных чисел с помощью клеточного автомата: Правило 30

Генераторы псевдослучайных чисел выдают числа детерминировано, но обычно такие числа выглядят непериодическими (случайными). По крайней мере, в большинстве случаев применения подобных чисел так обычно и происходит. Генератор принимает начальное значение (в идеале — истинное случайное число) и порождает последовательность чисел, работая как функция от начального значения и (или) от предыдущего числа последовательности. Подобные числа являются псевдослучайными (а не истинными случайными числами) из-за того, что если известно начальное значение, переданное генератору, эти числа можно сгенерировать снова алгоритмическим путём. Истинные случайные числа генерируют, используя специальное аппаратное обеспечение или некие физические явления — пульсовые колебания объёма крови, атмосферное давление, тепловой шум, квантовые процессы и так далее.

Существует множество способов генерирования псевдослучайных чисел. Например — алгоритм Блюма — Блюма — Шуба, метод средних квадратов, метод Фибоначчи с запаздываниями. Сегодня мы поговорим о генерировании случайных чисел с помощью Правила 30, которое использует неоднозначный подход, предусматривающий применение модели клеточного автомата. Этот метод прошёл множество стандартных тестов на случайность чисел и использовался в системе Mathematica для генерирования случайных целых чисел.

Клеточный автомат

Прежде чем мы перейдём к разговору о Правиле 30, уделим некоторое время клеточным автоматам. Клеточный автомат — это дискретная модель, состоящая из регулярной решётки ячеек любой размерности. Каждая из ячеек решётки может находиться в одном из конечного множества состояний. При этом для каждой ячейки определено такое понятие, как «окрестность». В окрестность некоей ячейки, например, могут входить все ячейки, находящиеся на расстоянии не более 2 от неё. Существуют правила, определяющие то, как ячейки взаимодействуют друг с другом и переходят в следующее поколение (состояние). Правила эти, в основном, представлены математическими (программируемыми) функциями, которые зависят от текущего состояния ячеек и от состояния их соседей.

Описание клеточного автомата

Описание клеточного автомата с предыдущего рисунка позволяет узнать о том, что каждая ячейка может находиться в одном из двух конечных состояний — 0 (показано красным) и 1 (показано чёрным). Каждая ячейка переходит в следующее поколение, принимая новое состояние, являющееся результатом применения операции XOR к её 8 соседям. Первое поколение (начальное состояние) решётки задаётся случайно. Ниже показана работа этого клеточного автомата.

Клеточный автомат, основанный на функции XOR, в действии

Идея клеточного автомата появилась в 1940-х годах благодаря Станиславу Уламу и Джону фон Нейману. Клеточные автоматы нашли применение в информатике, математике, физике, в теории сложных систем, в теоретической биологии, в задачах моделирования микроструктуры сред и материалов. В 1980-х Стивен Вольфрам провёл систематическое исследование одномерного клеточного автомата (его также называют элементарным клеточным автоматом), на котором и основано Правило 30.

Правило 30

Правило 30 — это элементарный (одномерный) клеточный автомат, в котором каждая ячейка может пребывать в одном из двух конечных состояния: 0 (красные ячейки на рисунке, приведённом ниже) и 1 (чёрные ячейки). Окрестности ячейки представлены её двумя ближайшими соседями, находящимися слева и справа от неё. Следующее состояние (поколение) ячейки зависит от её текущего состояния и от состояния её соседей. Правила перехода ячеек в следующее состояние показаны на следующем рисунке.

Правило 30

Эти правила перехода ячеек в новое состояние можно упрощённо записать так: left XOR (central OR right).

Мы выводим ячейки автомата в виде двумерной решётки, каждая строка которой представляет одно поколение (состояние). Когда вычисляется следующее поколение (состояние) ячеек, оно выводится ниже последнего известного состояния. Каждая строка содержит конечное количество ячеек, которые, в конце, «зацикливаются».

Правило 30 в действии

Вышеприведённый паттерн возникает из начального состояния (строка 0), когда одна ячейка имеет состояние 1 (чёрная), а все окружающие её ячейки имеют состояние 0 (красные). Состояние ячеек в следующем поколении (строка 1) вычисляется по вышеописанному правилу. Вертикаль решётки представляет собой время, а пересечения строк и столбцов представляют собой состояние конкретной ячейки на определённом этапе развития системы.

Поколение t и поколение t + 1

По мере развития паттерна в нём часто появляются красные треугольники разных размеров, но, в целом, в получающейся структуре нельзя распознать некий различимый паттерн. Вышеприведённый фрагмент решётки сделан в произвольно выбранный момент времени. Тут можно видеть хаос и апериодичность. Это свойство Правила 30 и используется для генерирования псевдослучайных чисел.

Генерирование псевдослучайных чисел

Как уже было сказано, Правило 30 демонстрирует апериодичное и хаотическое поведение. В результате его применение приводит к созданию сложных, и, как кажется, случайных паттернов по простым и чётко определённым правилам. Для генерирования случайных чисел с использованием Правила 30 используется центральный столбец решётки, из которого выбирается последовательность из n случайных битов, из которых формируется нужное n-битное случайное число. Следующее случайное число формируется с использованием следующих n битов из столбца.

Генерирование случайных чисел с использованием Правила 30

Если всегда начинать выбор ячеек с первой строки, то сгенерированная последовательность чисел всегда будет предсказуемой. А это — не то, что нам нужно. Для того чтобы создавать псевдослучайные числа, будем использовать случайное начальное значение (например — текущее время), пропускать соответствующее число строк, а уже после этого выбирать последовательности из n строк и создавать на их основе случайные числа.

Псевдослучайные числа, сгенерированные с использованием Правила 30, не являются криптографически безопасными, но они подходят для симуляций — до тех пор, пока мы не пользуемся неподходящими начальными значениями вроде 0.

Одно из серьёзных преимуществ применения Правила 30 для генерирования псевдослучайных чисел заключается в том, что можно создавать множество случайных чисел в параллельном режиме, случайным образом выбирая множество столбцов длины n бит. Вот пример псевдослучайной последовательности 8-битных чисел, сгенерированных этим методом с использованием начального значения 0: 220, 197, 147, 174, 117, 97, 149, 171, 240, 241.

Начальное значение, кроме того, может быть использовано для задания начального состояния модели (строки №0). В результате псевдослучайные числа можно получать, просто выбирая по n бит из центрального столбца, начиная с нулевой строки. Этот подход эффективнее, но он сильно зависит от качества начального значения. Неудачно выбранное начальное значение может привести к появлению хорошо предсказуемых чисел. Демонстрацию этого подхода можно найти здесь.

Правило 30 в реальном мире

Правило 30 можно видеть в природе, в форме узора на раковине брюхоногого моллюска вида Conus textile. Железнодорожная станция Кембридж-Северный оформлена панелями, изображающими результаты эволюции модели, построенной с использованием Правила 30.

Итоги

Если вы нашли Правило 30 интересным — рекомендую написать собственную симуляцию с использованием библиотеки p5. Реализовать этот алгоритм можно в достаточно общем виде, что позволит одной и той же программе генерировать паттерны для разных правил — 90, 110, 117 и так далее. Паттерны, сгенерированные с использованием различных правил, весьма интересны. Если хотите, можете перейти на следующий уровень. Можете расширить модель до трёх измерений и исследовать эволюцию паттернов. Я думаю, что программирование способно принести массу удовольствия в том случае, если в нём есть визуальная составляющая.

Восхитительно, когда две, как кажется, несвязанные друг с другом области науки, клеточные автоматы и криптография, объединяются ради создания чего-то удивительного. Хотя описанный здесь алгоритм больше не применяется достаточно широко из-за появления более эффективных алгоритмов, он подталкивает нас к креативному использованию клеточных автоматов.

Уважаемые читатели! Какими генераторами псевдослучайных чисел вы пользуетесь?

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть