随机队列模拟器客户到达时间

Random Queue Simulator Customer Arrival Time

本文关键字:时间 客户 队列 模拟器 随机      更新时间:2023-10-16

我在生成随机客户到达时遇到代码问题。因此,问题是假设一家商店每小时能接待15名顾客。(这是每分钟0.25个顾客)所以我的逻辑是,在那一分钟内有25%的机会得到顾客。

伪码:

generate a random float number 0.0 - 1.0 <= .25
     Add customer to queue

我在这里的第一个问题是,假设一家商店预计每小时有60名顾客,那么(每分钟1名顾客)在0.0-1.0以上的代码中总是<=到1,因此60%的客户将被添加到队列中。

第二个问题是,假设商店预计每小时有15个客户,那么他们有可能在那一分钟得到一个或多个客户。我如何在我的代码中实现这一点。

在过去的两天里,我一直在研究队列理论(泊松,指数分布),但在找到解决方案方面并没有取得进展。

您可以解决这两个问题,而不是每分钟检查一次,而是在不到一分钟的时间内检查一次。例如,如果你把你的机会除以60,而不是每秒检查一次,那会更准确。

对于这样的问题,要得到100%准确的答案是不可能的,所以试着寻找一个足够好的解决方案。

祝好运

我找到了解决问题的方法,所以只想分享它。

int ModelArrivalTimeGenerator::generateTime(double rate)
{
    std::random_device rd;
    std::mt19937_64 mt(rd());
    std::uniform_real_distribution<double> distribution(0, 1);
    return floor(-1/rate * log(distribution(mt)));
}

假设您想使用每小时40的到达率来运行模拟。传入(40.00/60.00)作为参数。我做了一些测试,发现它在随机到达平均值方面相当不错。

如果你运行n次,这是一个可以用来检查平均值的代码。

double lamda = (15.00/60.00);   //(15customer/60min) gets you Arrival Rate per minute
    std::random_device rd;
    std::mt19937_64 mt(rd());
    std::uniform_real_distribution<double> distribution(0, 1);
    int CustomerArrivedAtTime = 0;
    int runThisManyTime = 20;
    int arrivalNum =0; 
    for(int i=0; i<runThisManyTime; i++)
    {
        while(CustomerArrivedAtTime < 60)
        {
            arrivalNum++;
            CustomerArrivedAtTime +=  floor(-1/lamda * log(distribution(mt)));
            cout << "Arrival#" << arrivalNum << " " << CustomerArrivedAtTime << "n";
        }
        CustomerArrivedAtTime = 0;  // this is complete of first run 60 min is past in sim time so we reset for other run
    }
    cout << "nn AVG: " << arrivalNum/runThisManyTime;