Проблемы, имитирующие время поступления

Я пытаюсь смоделировать возникновение события (транспортное средство, въезжающее в туннель), которое, как оказалось, является пуассоновским процессом.

Я разбил день на 1-минутные интервалы, начиная с 9 утра до 5 вечера.

Для каждого 1-минутного интервала я вычислил / получил среднее значение:

Количество транспортных средств, которые въезжают в туннель за этот период.Время между каждым транспортным средством, въезжающим в туннель (ожидаемое время прохождения)

Например, для минуты 10: 37-38 среднее значение составляет 5 транспортных средств со средним временем прибытия 12 секунд.

Для пробы 10: 37-38 минут я делаю следующее:

Пример распределения Пуассона со средним значением 5, чтобы определить, сколько предметов прибудет, назначьте XПример экспоненциального распределения среднего значения в 1/12 X раз для получения времени между прибытием y_0, y_1 ..._ y_xСуммируйте время поступления и присвойте KЕслиK больше 60 секунд перейти к шагу 2Накопить различные счетчикиНаконец распечатать статистику.

Код выглядит следующим образом:

#include <iostream>
#include <cstdio>
#include <random>
#include <algorithm>
#include <iterator>

int main()
{

   double mean_num_itms = 5.0;
   double mean_inter_time = 12; //seconds
   double max_sec_in_period = 60; //seconds

   unsigned int rounds = 10000;

   std::random_device r;
   std::exponential_distribution<double> exponential(1.0 / mean_inter_time);
   std::poisson_distribution<double> poisson(mean_num_itms);

   double total_itms = 0;
   double total_inter_time = 0;

   for (std::size_t i = 0; i < rounds; ++i)
   {
      //Determine how many items will arrive in time period
      unsigned int num_itms = (unsigned int)(poisson(r));

      total_itms += num_itms;

      //Get the interarrival times for the 'num_itms'
      double last_arrival_time = 0;
      do
      {
         last_arrival_time = 0;
         for (unsigned int j = 0; j < num_itms; ++j)
         {
            double current_arrival_time = exponential(r);
            last_arrival_time += current_arrival_time ;
         }

      }
      //Reject any group of arrival times that exceed period span.
      while (last_arrival_time > max_sec_in_period);

      total_inter_time += last_arrival_time;

   }

   printf("Mean items per minute:   %8.3f\n"   ,total_itms / rounds);
   printf("Mean inter-arrival time: %8.3fsec\n",total_inter_time / total_itms);

   return 0;
}

Проблема с кодом выше:

Отклонение части очень дорого

Результаты для среднего времени прибытия неверны:

Среднее количество пунктов в минуту: 5.014Среднее время прибытия: 7,647сек

Итак, мои вопросы таковы:

Существует ли лучший, более эффективный метод, обеспечивающий, чтобы общее время между прибытиями никогда не превышало максимальное количество секунд в периоде?

Почему среднее время прибытия искажено? для приведенного выше примера я ожидаю, что он будет примерно 12 - я думаю, что в коде есть ошибка, но, похоже, я не могу это понять.

Ответы на вопрос(2)

Ваш ответ на вопрос