Генерировать (Пуассона?) случайная величина в реальном времени


У меня есть программа, работающая в режиме реального времени, с переменной частотой кадров, например, может быть 15 кадров в секунду, может быть 60 кадров в секунду. Я хочу, чтобы событие происходило в среднем каждые 5 секунд. Каждый кадр я хочу вызвать функцию, которая принимает время с момента последнего кадра в качестве входных данных и возвращает True в среднем каждые 5 секунд истекшего времени, учитывая, что она вызвана. Я думаю, что-то связанное с распределением Пуассона.. как бы я это сделал?

2 3

2 ответа:

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

Таким образом, если вы хотите получить распределение Пуассона, вы можете довольно легко генерировать выборки, используя функцию кумулятивной плотности. Просто следуйте псевдокоду здесь: генерация Poisson RVs , с 5 секундами, являющимися вашим значением для лямбда. Назовем эту функцию Poisson_RN ().

Алгоритм на этом этапе довольно прост.

global float next_time = current_time()

boolean function foo()
if (next_time < current_time())
  next_time = current_time() + Poisson_RN();
  return true;
return false;

Случайная величина, которая генерирует истинные / ложные результаты в фиксированных пропорциях при независимых испытаниях, называется геометрической случайной величиной. В любом временном интервале генерируйте true с вероятностью 1/(5*fps), и в долгосрочной перспективе вы получите в среднем одну true за 5 секунд.