Меню

Аналоговый генератор случайных чисел

Случайные числа

Я думаю понятие случайных чисел/величин вам знакомо: они случайны. Иногда в самодельном устройстве бывает нужна случайная величина, например для какой-нибудь игры или световых эффектов. Программный источник настоящих случайных чисел организовать весьма непросто, в отличие от аппаратного. Банально игральный кубик или лото-машина являются вполне себе хорошими источниками случайных чисел. Микроконтроллер к слову не может генерировать случайные числа, потому что он – точное вычислительное устройство, случайностей быть не может. Что делать? Использовать такое понятие, как псевдослучайные числа. Чем они отличаются от случайных? Своей природой. Псевдослучайное число получается путём различных математических действий с начальным числом, то есть имея начальное число, мы можем сгенерировать на его основе целую кучу других чисел. Но тут есть две проблемы:

  • Через какое-то количество чисел (тысяч, а может и миллиардов, а может и больше) ряд сгенерированных псевдослучайных чисел начнёт повторяться. Для наших целей это не так страшно, можно об этом не думать
  • Генератору псевдослучайных чисел нужно начальное случайное число. Вот это реально беда… Но ничего, у нашего микроконтроллера есть и аппаратные средства

Ардуино и случайные числа

Ардуино имеет пару готовых функций для работы с псевдослучайными числами, давайте на них посмотрим:

  • random(max); – возвращает псевдослучайное число в диапазоне от 0 до ( max – 1 ). max принимает unsigned long , то есть от 0 до 4 294 967 295
  • random(min, max); – возвращает псевдослучайное число в диапазоне от min до ( max – 1 ). max принимает unsigned long , то есть от 0 до 4 294 967 295
  • randomSeed(value); – дать генератору псевдослучайных чисел новую опорную точку для отсчёта. value – любое число типа unsigned long , значит на Ардуино мы имеем 2^32 (4 294 967 295) наборов псевдослучайных чисел. На ваш век этого точно хватит!

Как правильно генерировать случайные числа, чтобы последовательность каждый раз была новая? Есть варианты:

  • При запуске программы задавать случайное число в randomSeed() . Как это сделать? Расскажу ниже
  • Если устройство как-то взаимодействует со внешним миром, или даже с пользователем, то можно при наступлении некоторых аппаратно случайных событий (нажатие кнопки, срабатывание датчика, принятие данных, и т.д.) скармливать randomSeed‘у текущее время с момента старта программы, т.е. функции millis() или micros() . Отличное решение кстати! Банально вызываем randomSeed(micros()) и всё.

Аппаратный рандом

Помните, в уроке про цифровые пины я говорил, что если пин никуда не подключен – то он ловит “из воздуха” всякие наводки. Шумы имеют природу, близкую к случайной, и было бы глупо этим не воспользоваться! Давайте посмотрим, какие значения можно получить с никуда не подключенного аналогового пина, опрашивая его обычным analogRead();

Синусоида? Вполне логично, в стенах куча проводов с сетевым напряжением, вот они и наводят на микроконтроллер всякие помехи. Можно ли пользоваться сырым значением с аналогового пина в качестве “зерна” для randomSeed() ? Нужно! То есть при запуске устройства делать вот так:

Но есть ещё интересный вариант, который позволит получить гораздо более случайные числа для randomSeed() . Есть информация, что первые два бита из результата analogRead() имеют самый большой шум. Давайте на него посмотрим, выведя несколько (300) результатов в график. Получить первые два бита можно так: analogRead(A0) & 0b0000011 , или более коротко – analogRead(A0) & 3

Читайте также:  Как проверить генератор квадроцикла мультиметром

Выглядит весьма случайно, никакой закономерности не прослеживается! Но значения меняются всего от 0 до 3. Поэтому можно попробовать их перемножать и складывать, примерно так:

Именно такой код я рекомендую использовать для получения случайного зерна для генератора случайных чисел при запуске программы. Напоследок давайте посмотрим, какой результат даёт такая конструкция:

График я построил в excel, чтобы более чётко видеть рассеивание полученного случайного значения Имеем практически равномерное рассеяние и огромное количество случайных значений, полученных путём перемножения и сложения “шума”. Пользуйтесь на здоровье.

Случайный bool

Иногда бывает нужен случайный флаг, то есть true / false . Делается это очень просто: в уроке про условия я рассказывал, что bool ( boolean ) принимает true при любом отличном от нуля значении. Это можно использовать для получения случайного true / false с заданной вероятностью! Просто присваиваем логической переменной результат функции random() , в которую передаём число, обратное вероятности получения false :

Переменная rndFlag получит значение false с вероятностью 1/5, то есть 20%. Если нужен true с низкой вероятностью – используем инверсию:

Теперь переменная rndFlag получит значение true с вероятностью 10%.

Видео

Источник

Истинные случайные числа своими руками

Генераторы случайных чисел являются чрезвычайно важной составляющей многих алгоритмах, к примеру, алгоритмов шифрования или численных методов Монте-Карло. Как известно, компьютеры являются детерминированными, предсказуемыми машинами. Если написать программу и выполнить ее при тех же условиях миллион раз, то вы получите миллион одинаковых ответов. Такая природа компьютеров очень хорошо служила нам на протяжении большей части прошлого века, но, к сожалению, эта конструкция имеет фундаментальный недостаток: компьютеры не могут выполнять случайные операции. Несмотря на то, что те к числа, которые генерируют компьютеры, могут быть достаточно случайными на первый взгляд, все таки они являются “псевдо”-случайными. Это значит, что часто можно предсказать, какое число выдаст устройство.

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

Давайте попробуем разобраться как классический компьютер генерирует случайные числа, что такое квантовая случайность и как можно получить истинные случайные числа сегодня?

Генераторы случайных чисел сегодня

Большинство популярных языков программирования имеют генератор случайных чисел, который принимает некоторые входные данные, такие как дата и время, затем преобразует эти данные с помощью алгоритма и выводит число. Это число настолько отличается от входных данных, что мы воспринимаем его как случайное. Но это не так: преобразование внутри генератора — предсказуемый алгоритм , и хотя почти для всех практических приложений эта система работает отлично, она не является действительно случайной.

Например, в генераторе случайных чисел Math.random(), предоставляемый Javascript, используются сдвиги и реверсирования битовых представлений входных данных. Для того, чтобы эта функция выдавала разные результаты каждый раз, когда она запускается, нужно задействовать все время изменяющееся данные. По этой причине часто используются числовое представление текущей даты и времени, например, количество миллисекунд, прошедших с 1 января 1970 года, начала эпохи UNIX.

Используя такой алгоритм можно достичь очень убедительного генератора случайных чисел. Однако, если кто-то знает, как работает алгоритм, и может предсказать входные данные, то он может и предсказать случайные числа , выдаваемые этим генератором. Один из способов улучшить случайность этой системы — сделать входные данные более трудным для прогнозирования. Например, многие системы используют космическое микроволновое фоновое излучение (электромагнитные волны, оставшиеся после Большого Взрыва), поскольку никто не может предсказать, как этот фоновый шум будет вести себя в определенный момент времени.

Читайте также:  Keysight генератор сигналов n9310a

Генераторы, использующие непредсказуемые входные данные, такие как микроволновый фон, действительно совершенно случайны и не могут быть предсказаны. Однако, если мы будем проводить абсолютно те же измерения космического микроволнового фона, что и кто-то другой, и использовать результаты измерений в качестве входных данных для заранее известного алгоритма, мы сможем предсказать результат. Для того, чтобы перейти к истинной случайности , необходимо найти в природе то, что никто не сможет предсказать — то, что может быть описано только некоторой вероятностью. Еще в конце 19-ого века считалось, что таких процессов не существует, но квантовая механика открыла двери в более странный и непредсказуемый мир.

Вероятность в квантовом мире

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

Одна из интерпретаций квантовой механики утверждает, что квантовые системы не имеют определенных свойств до измерения, а существуют во всех возможных состояниях одновременно, это называется суперпозиция . При наблюдении за системой суперпозиция разрушается и система начинает существовать в одном определенном состоянии. На примере положения электрона мы можем предсказать вероятность того, что электрон будет присутствовать в определенном месте в определенное время, но до этого измерения электрон существует во всех возможных положениях вокруг атома.

Эта интерпретация квантового мира, по понятным причинам, потрясла сообщество физиков в то время и обсуждается по сей день. Эйнштейн отказывался верить, что реальность управляется вероятностью, и говорил: «Я, во всяком случае, убежден, что он (Бог) не играет в кости”, в ответ Нильс Бор ответил: «Эйнштейн, не говори Богу, что делать.»

Нравится нам это или нет, но квантовая теория остается нашей лучшей теорией для описания субатомного мира, а теперь на ее основе строятся процессоры нового типа. Квантовые компьютеры полагаются на способность квантовых частиц существовать в суперпозиции нескольких состояний одновременно для выполнения вычислений. Поскольку квантовые компьютеры могут манипулировать суперпозицией частиц, мы можем использовать их в качестве инструмента для построения истинного генератора случайных чисел .

Квантовые компьютеры

Классические компьютеры используют биты для представления информации. Бит может принимать значения 0 или 1 и представлен одним из двух значений постоянного напряжения внутри процессора компьютера. Квантовые компьютеры обычно представляют информацию таким же образом, используя 0 или 1, но физически они реализуют эти состояния, используя бинарные свойства субатомных частиц . Эти свойства могут быть спином электрона (спин вверх и спин вниз) или поляризацией фотона (горизонтальная и вертикальная поляризация) — любое из этих представлений может быть описано квантовой механикой, и может находиться в суперпозиции, то есть квантовый бит информации (кубит) может существовать в состояниях 0 и 1 одновременно. Чтобы получить результат вычисления, мы должны измерить квантовое состояние внутри компьютера и заставить эти частицы выбрать значение 0 или 1. Фактически, мы разрушаем суперпозицию и принуждаем ее к одному из этих двух возможных состояний, каждое из которых имеет равную вероятность возникновения — у нас есть 50% шанс измерения либо 1, либо 0.

Читайте также:  Unturned как скрафтить генератор воздуха

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

1. Инициализировать кубит, пусть он будет в состоянии 0.

2. Поместить кубит в суперпозицию, для этого можно использовать специальное преобразование ( преобразование Адамара ).

3. Произвести измерение и получить значение 0 или 1 с равной вероятностью.

Звучит сложно? Субатомные частицы, квантовый компьютер, кубиты. Наверное, у обычных людей не скоро появится ко всему этому доступ.

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

Программирование квантового компьютера

Удивительно, но некоторые компании сделали квантовые компьютеры доступными для всех через облачный сервис еще несколько лет назад. К примеру, IBM представил систему IBM Q Experience, которая дает доступ к двум 5-кубитным процессорам и двум 16-кубитным процессорам (а сейчас на подходе и 53-кубитный). После того, как пользователь создал бесплатную учетную запись, время на использование квантового компьютера выделяется с помощью кредитной системы. Вы можете спроектировать свою схему с помощью онлайн-редактора или с помощью кода и библиотеки Qiskit от IBM (о ней мы писали ранее ), и, когда ваша программа готова, она помещается в очередь и затем выполняется на настоящей квантовой машине .

Вот как работает программа, которая выдает истинно случайные числа от 0 до 16, написанная с помощью Qiskit:

1. Классический компьютер вычисляет, сколько случайных битов требуется для представления числа от 0 до 16. В этом случае требуется 4 бита, то есть мы можем использовать 5-кубитный квантовый процессор.

2. Пакет Qiskit создает ряд инструкций и отправляет их в IBM Q Experience для выполнения.

3. Ваши инструкции помещаются в очередь для запуска на квантовым процессоре IBM Q5 Tenerife . Далее квантовый компьютер выделяет 4 из 5 доступных кубитов для вашей задачи и применяет преобразование Адамара к этим 4 кубитам, вводя их в суперпозицию.

4. Состояние каждого кубита измеряется, разрушается квантовая суперпозиция, и выявляется случайное состояние, которое затем выводится в 4-битный классический регистр.

5. Измеренное состояние 0 или 1 затем отправляется обратно в IBM Q Experience и, затем, обратно к вам на компьютер.

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

Программа

Если вы хотите научиться управлять квантовым компьютером, то для построения генератора случайных чисел лучше использовать Qiskit: нужно будет написать код на Python (тут мы писали, почему стоит учить Python , если вы его еще не выучили), и протестировать его на квантовом процессоре. Для того, чтобы начать, необходимо создать бесплатную учетную запись в IBM Quantum Experience . Затем получить API и запустить программу:

Источник

Adblock
detector