§3. Показательный датчик без логарифмов: фокус фон Неймана
Формула из §1 хороша всем, кроме одного: в ней логарифм, а компьютер считает его не бесплатно. Фон Нейман придумал, как получить показательный закон вообще без логарифмов — одними сравнениями чисел. Звучит как развод, но работает железно.
Таблица и нисходящие серии
Представь таблицу независимых равномерных на чисел, читаем её по строкам:
В каждой строке смотрим, как долго числа идут на убыль с самого начала. Номер числа, которое первым оказалось больше предыдущего и оборвало спад, обозначим :
Это ровно «нисходящая серия» из задачи 2 главы 2, где мы получили . Теперь назовём строку успехом, если чётное, и неудачей, если нечётное.
Рецепт
Утверждение 2. Пусть — число неудач до первого успеха. Тогда величина — число неудачных строк плюс первое число успешной строки — распределена по показательному закону с параметром .
То есть алгоритм совсем детский:
- Тянешь строку: первое число запоминаешь, дальше тянешь числа, пока они убывают.
- Спад оборвался на чётном номере — успех: ответ равен «сколько было неудач» плюс «первое число этой строки».
- Оборвался на нечётном — неудача: счётчик неудач +1, тянешь новую строку.
Ни одного логарифма, только сравнения «больше-меньше». Целую часть ответа даёт счётчик неудач, дробную — первое число строки.
Почему это работает
Разберём по кирпичикам. Сначала поймём, с какой вероятностью серия держится долго и при этом первое число не больше :
Почему так: все чисел должны попасть на отрезок (шанс ) и встать строго по убыванию — а из равновероятных порядков нужный ровно один. Отсюда вероятность, что серия оборвалась ровно на -м числе:
Складываем по чётным — получается знакопеременный ряд, который сворачивается в знакомую экспоненту:
При это вероятность успеха: , а неудачи — . Строки независимы, поэтому
А теперь финальный аккорд — свойство самого показательного закона. Возьмём и разрежем на целую часть и дробную . Оказывается (это утверждение 3, его проверим в задачах), они независимы: целая часть распределена геометрически, , а дробная имеет функцию распределения на . Значит
— ровно то же, что у нашей пары «число неудач» и «первое число успешной строки». Совпали законы целой и дробной частей, значит совпали и суммы: распределено как . Вот и весь фокус.
По-дворовому: счётчик неудач — это «сколько целых часов прождал», а первое число удачной строки — «сколько ещё минут сверху». Склеил — получил честное время ожидания по показательному закону.
Покрути виджет: гистограмма датчика ложится на , а счётчик внизу показывает, что логарифмов ноль, а равномерных уходит около на каждое число.
Откуда : в строке в среднем числа, а строк на один успех уходит в среднем . Перемножаем: .
Код датчика целиком:
Цена фокуса — чисел тратится больше (около 4,3 вместо одного у обратной функции). Выгоден он там, где логарифм дорог, а равномерные числа дешёвые. В следующем параграфе — другой подход: логарифм оставить, но считать его один раз на целую пачку чисел.