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

时间:2015-02-25 22:55:45

标签: c++ data-structures queue

我在生成随机客户到达时遇到代码问题。所以问题是假设商店每小时可以获得15个顾客。 (那是25分钟的客户)因此,我的逻辑是25%的可能性让客户花了一分钟的时间。

伪代码:

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

我在这里的第一个问题是假设一家商店预计每小时有60名顾客,这样(1名顾客一分钟)查看我的代码0.0 - 1.0以上将总是&lt; = 1,因此会增加60名顾客排队100%的时间。

第二个问题是假设商店预计15个客户每小时就有机会在那一分钟获得1个​​或更多客户。我如何在我的代码上实现它。

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

2 个答案:

答案 0 :(得分:0)

您可以通过不是每分钟检查而不是每分钟检查来解决这两个问题。如果你只是将你的机会除以60而不是每秒检查一次就会更准确。

为这样的问题获得100%准确的答案是不可能的,所以尝试寻找一个足够好的解决方案。

祝你好运

答案 1 :(得分:0)

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

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)作为参数。我做了一些测试,发现它在随机到达平均值方面相当不错。

这是一个代码,你可以用它来检查你运行它的平均值是多少。

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;