Sod*_*der 2 c++ simulation math sample distribution
我试图模拟事件的发生(车辆进入隧道),事实证明这是一个泊松过程.
从上午9点到下午5点,我把这一天打破了1分钟.
对于每1分钟的间隔,我已经计算/获得了平均值:
例如,对于分钟10:37-38,平均值是5辆车,平均到达时间为12秒
为了抽样10:37-38分钟,我做了以下事情:
代码如下:
#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;
}
Run Code Online (Sandbox Code Playgroud)
上面代码的问题是:
拒绝部分非常昂贵
平均到达间隔时间的结果不正确:
所以我的问题如下:
是否有更好的更有效的技术来确保总到达间隔时间不会超过该期间的最大秒数?
为什么平均到达时间会下降?对于上面的例子,我预计它大约是12 - 我认为代码中有一个错误,但似乎无法将其放在它上面.