Для замены существующего алгоритма «каждый период N сравнивает случайное число с вероятностью X», какова правильная функция F
, чтобы вместо этого вычислять случайную задержку до следующего вхождения?
Я хочу переписать существующую функцию.Псевдокод:
interval_step ← (N milliseconds)
Every (interval_step):
If random() < X:
event_occurs()
Таким образом, событие может произойти (с вероятностью X
) в N
миллисекундах в ближайшее время.Не существует верхней границы для последних, когда событие может произойти, но большие кратные значения N
становятся все менее вероятными.
Мой математический навык недостаточно хорош, чтобы сказать, какая формула описывает это.Я думаю, что это геометрическая прогрессия, может быть, логарифмическая?
Новая реализация должна вместо этого производить эквивалентное распределение событий по времени, но без цикла опроса.Вместо этого я хочу установить таймер на случайный интервал, вычисляемый из X
.Псевдокод:
interval_step = (N milliseconds)
schedule(fire_event, interval=random_interval_to_next_event())
random_interval_to_next_event():
interval ← F(random_number=random(), probability=X)
Return interval
fire_event():
schedule(fire_event, interval=random_interval_to_next_event())
event_occurs()
Это позволяет избежать цикла опроса оригинала, предварительно рассчитав каждое вхождение для одного случайного времени (вычисляемого функцией F
) в будущем, все еще используя приращения interval_step
.
Я был бы достаточно счастлив установить произвольную верхнюю границу где-то внутри F
(возможно, на основе большого числа стандартных отклонений от X
), чтобы избежать потенциально бесконечного вызова функции.Я был бы так же рад избежать этого, если это было бы ненужным осложнением.
(В ответ на обсуждение) Я также рад предположить усеченную точность, чтобы эффективно ограничивать асимптотически малые вероятности в долгосрочной перспективе.хвост.Предположим, существует функция truncate_precision(number, precision_digits=12)
, которая допускает что-то вроде:
F(random_number, probability):
foo ← (random_number * truncate_precision(SOME_CALCULATION))
Return foo
или тому подобное.Это позволяет избежать потери значимости при очень низких вероятностях.
Какая правильная реализация функции F
для получения эквивалентного распределения вероятности X
оригинала?