§1. Физические датчики: откуда берут живую случайность
В первой главе мы гоняли одну случайную величину за раз. Но в реальном деле их нужно пачками: прогнать симуляцию, проверить гипотезу, разыграть тысячу вечеров подряд. И тут вылезает вопрос, на который новичок обычно машет рукой: а где, собственно, взять столько случайных чисел? Не из головы же тянуть — человек «случайные» цифры называет предсказуемо, его на этом легко подловить.
Договоримся о главном герое. Пусть — координаты точек, взятых наудачу из отрезка : независимые и равномерно распределённые (помнишь равномерное из первой главы — «тычешь пальцем, не глядя»). Вот такой ровный поток «наугад из » нам и нужен как сырьё.
Проблема. Как построить числовую последовательность , которую можно было бы считать реализацией случайных величин ?
Числа такой последовательности называют псевдослучайными, а устройства или алгоритмы, которые их выдают, — датчиками (ещё говорят «генераторы»). По-нашему: датчик — это станок, который штампует случайность на поток. В этом параграфе — про станки железные, физические.
Рулетка — самый честный станок
Простейший физический датчик — это, считай, рулетка. Представь стрелку, которая крутится вокруг оси почти без трения, а её конец бегает по окружности длиной ровно 1. Раскрутил от души — стрелка покрутилась и встала где попало. Запиши, в каком месте окружности застыл кончик (отмеряя от нуля по кругу) — вот тебе и число .
Почему это честно? Потому что у хорошо раскрученной стрелки нет любимого места — ей всё равно, где останавливаться. Любой кусочек окружности она ловит с шансом, равным длине этого кусочка. А это ровно и есть определение равномерного распределения на . Крутани барабан на районе — где шарик ляжет, там и ляжет, блата нет.
Монетка строит число по битам
Рулетка — красиво, но есть способ получить случайное число вообще из одной кривой монеты. И тут всплывает важное утверждение, ради которого стоит потерпеть одну формулу.
Любое число из можно записать в двоичном виде — как сумму половинок, четвертинок, восьмушек и так далее:
где каждый — это или (двоичный разряд). Разберём по кирпичикам, тут всё просто:
- — это — вес -го разряда. Первый бит стоит половину, второй — четверть, и дальше всё мельче.
- — включён разряд или нет: — прибавляем его вес, — пропускаем.
- — складываем все включённые веса. Получается число где-то в .
По-дворовому: представь, что набираешь сумму монетами разного номинала — рубль, полтинник, четвертак… только тут номиналы . Каждый бит решает, кладём эту «монетку» в кучу или нет.
А теперь сам факт: число будет равномерным на тогда и только тогда, когда его биты — это схема Бернулли с (независимые, и каждый с шансом оказаться единицей). Схему Бернулли мы как раз разобрали в первой главе — «выгорело/спалился» с честной монетой.
Отсюда рецепт в лоб: хочешь псевдослучайное число — подбрось симметричную монету раз. Выпал герб на -м броске — прибавь . Получишь число с точностью до (чем больше бросков, тем больше знаков после запятой). Пощупаем руками — вот этот рецепт в коде, жми Run:
Среднее липнет к — ровно как положено равномерному на . Монетка и правда работает датчиком, просто медленно.
Шум в проводах — случайность из помех
Монету подбрасывать долго. Поэтому физики ловят случайность прямо из электрического шума — тех самых помех, что всегда гуляют в проводах.
Берём шумящий сигнал и порог — уровень . Нас интересуют моменты , когда шум пересекает этот порог (снизу вверх или сверху вниз). А бит назначаем так: внутри каждого такта электронных часов (длины ) смотрим, в первую половину такта случилось пересечение или во вторую — пишем или . Если такт короче, чем среднее время между пересечениями, биты получаются честные.
По-нашему: помеха скачет как бешеная, предсказать её ты не можешь — вот и снимаем с неё случайные нули-единицы, как подслушиваешь обрывки чужого базара на районе: когда именно долетит слово — заранее не угадаешь.
Почему физику в итоге задвинули
Железные датчики честные, но для работы с компьютером у них три жирных минуса:
- Нужно спецоборудование — рулетка, шумовая схема, да ещё и настраивать её аккуратно. Не у каждого под рукой.
- Невоспроизводимость. Прокрутил серию — и всё, ту же самую последовательность ты уже не повторишь. А для отладки симуляции это беда: хочется прогнать тот же расклад ещё раз и сравнить. Тот вечер уже не отмотаешь назад.
- Медленно и несовместимо с компом. Пока железка намотает свои числа, процессор успел бы посчитать миллион. Скорости несоизмеримы.
Из-за этих минусов от чистой физики в вычислениях почти ушли. На замену пришли таблицы случайных чисел (следующий параграф) и, главное, математические датчики — алгоритмы, которые гонят псевдослучайность прямо в процессоре (§3). Там-то и начнётся самое интересное — включая историю про то, как один знаменитый датчик с треском опозорился.