我正在尝试为流程的到达和服务时间生成指数分布。在 C++ 中,我的示例工作正常,并在 [0, inf) 范围内生成伪随机数,并且一些比预期的更大。在 Java 中,它不起作用。这些数字比它们的 C++ 等价物小几个数量级,即使我使用相同的公式,我也从来没有得到任何大于 0.99 的值。在 C++ 中,我得到 1.xx 或 2.xx 等,但在 Java 中从来没有。
lambda 是平均到达率,从 1 到 30 不等。我知道 rand.nextDouble() 给出 b/w 0 和 1 的值,从给出的公式和本网站上的答案来看,这似乎是需要的零件。
我应该提到,将我的分布值乘以 10 可以让我更接近它们需要的位置,并且它们的行为符合预期。
在 Java 中:
Random rand = new Random();
// if I multiply x by 10, I get much closer to the distribution I need
// I just don't know why it's off by a factor of 10?!
x = (Math.log(1-rand.nextDouble())/(-lambda));
我也试过:
x = 0;
while (x == 0)
{
x = (-1/lambda)*log(rand.nextDouble());
}
我得到的 C++ 代码:
// returns a random number between 0 and 1
float urand()
{
return( (float) rand()/RAND_MAX );
}
// returns a random number that follows an exp distribution
float genexp(float lambda)
{
float u,x;
x = 0;
while (x == 0)
{
u = urand();
x = (-1/lambda)*log(u);
}
return(x);
}