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

Random Queue Simulator Customer Arrival Time

我在生成随机客户到达时遇到了代码问题。所以问题是假设一家商店预计每小时接待 15 位顾客。 (那是每分钟 .25 个客户)所以我的逻辑是在那一分钟内有 25% 的机会获得客户。

伪代码:

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

我的第一个问题是假设商店预计每小时有 60 名顾客,所以(每分钟 1 名顾客)查看我的代码 0.0 - 1.0 将始终 <= 1,因此 60 名顾客将被添加到队列 100 % 的时间。

第二个问题是,假设商店预计每小时接待 15 位顾客,他们有可能在那一分钟接待 1 位或更多位顾客。我怎样才能在我的代码上实现它。

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

您可以解决这两个问题,而不是每分钟检查一次,而不是每分钟检查一次。例如,如果你只是将你的机会除以 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 << "\n\n AVG: " << arrivalNum/runThisManyTime;