Как смоделировать прибытие Пуассона?
Я хочу генерировать события, которые "прибывают" с "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)]
Благодаря этой ссылке.