Problemas que simulam os tempos de entrevista

Estou tentando simular a ocorrência de um evento (um veículo entrando em um túnel), que, como se constata, é um processo de Poisson.

Eu quebrei o dia em intervalos de 1 minuto, começando das 9h às 17h.

Para cada intervalo de 1 minuto, calculei / obtive a média:

Número de veículos que entram no túnel durante esse período.Tempo entre cada veículo que entra no túnel (tempo esperado entre chegadas)

Por exemplo, para o minuto 10: 37-38, a média é de 5 veículos com um tempo médio de chegada de 12 segundos

Para provar o 10: 37-38 minuto eu faço o seguinte:

Amostra de uma distribuição de Poisson com uma média de 5 para determinar quantos itens chegarão, atribuir a XAmostra de uma distribuição exponencial de 1/12 vezes X vezes para derivar os tempos entre chegadas y_0, y_1 ..._ y_xSoma os tempos entre chegadas e atribui a KE seK é maior que 60 segundos, vá para o passo 2Acumule vários contadoresFinalmente imprima estatísticas.

O código é o seguinte:

#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;
}

O problema com o código acima é:

A parte da rejeição é muito cara

Os resultados do tempo médio de chegada estão incorretos:

Média de itens por minuto: 5,014Tempo médio de chegada entre chegadas: 7.647 segundos

Então minhas perguntas são as seguintes:

Existe uma técnica melhor e mais eficiente para garantir que os tempos totais de chegada nunca excedam o número máximo de segundos no período?

Por que o tempo médio de chegada é desequilibrado? Para o exemplo acima, espero que seja aproximadamente 12 - acho que há um bug no código, mas não consigo colocar o dedo nele.

questionAnswers(2)

yourAnswerToTheQuestion