Как смоделировать приезд Пуассона? - PullRequest
2 голосов
/ 01 марта 2011

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

Спасибо.

Ответы [ 3 ]

3 голосов
/ 14 августа 2013

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

Это может быть решено для 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 (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....
}
2 голосов
/ 05 февраля 2015

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)]

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

2 голосов
/ 01 марта 2011

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

...