Как смоделировать прибытие Пуассона?

Я хочу генерировать события, которые "прибывают" с "t" секундами как средняя задержка между прибытием? Начиная с момента 0, как я могу сгенерировать время, когда событие происходит? По сути, я хочу создать последовательность моментов времени, таких как t1, t2, t3, ..., когда происходит событие. Как мне написать такую ​​функцию?

Спасибо.

3 ответа

Решение

Вы не говорите, на каком языке - но посмотрите на случайную переменную Generate (Пуассона?) В режиме реального времени

Самое простое решение состоит в том, чтобы вычислить время следующего события на основе "L" задержки между прибытием. Это основано на кумулятивной функции распределения для экспоненты: F(x) = 1 - e**(-lambda * x), где lambda - 1/L, среднее время, а x - количество времени.

Это может быть решено для х и снабжено равномерным случайным числом:

x = -ln (1-U) / лямбда, где U - случайное значение 0..1.

По ссылке 1:

#include <math.h> 
#include <stdlib.h>

float nextTime(float rateParameter) {
  return -logf(1.0f - (float) random() / (RAND_MAX + 1)) / rateParameter;
}

Эта ссылка содержит много информации о том, как это сделать, а также примеры в разделе Как генерировать случайные моменты времени для пуассоновского процесса.

Обратите внимание, что существуют другие функции распределения вероятностей, которые можно использовать для генерации событий (равномерное, треугольное и т. Д.). Многие из них могут быть сгенерированы либо кодом из Boost, либо с использованием GNU Scientific Library (GSL).

Итак, чтобы вычислить время событий: next_event = time() + nextTime(D); follow_event = next_event + nextTime(D);

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

deltaT = nextTime(MEAN_EVT);
dur    = nextTime(MEAN_DUR);
if (deltaT <= dur) {
  // either fix duration or get another event....
}

Python содержит random.expovariate, что делает это очень простым в Python. Например, чтобы создать 10 образцов:

import random
random.expovariate(0.2) for i in range(10)]

Как правило, это будет преобразовано в целое число:

import random
[int(random.expovariate(0.2)) for i in range(10)]

Благодаря этой ссылке.

Другие вопросы по тегам