Самым простым решением является вычисление времени следующего события на основе задержки между прибылями "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....
}