Я пытаюсь сгенерировать экспоненциальное распределение для времени прибытия и обслуживания процессов. В C ++ пример, который я имею, работает нормально и генерирует псевдослучайные числа в диапазоне [0, inf), а некоторые больше, чем ожидалось. В Java это не работает. Числа на порядки меньше, чем их эквиваленты в C ++, и я НИКОГДА не получаю никаких значений> 0,99, даже если я использую одну и ту же формулу. В C ++ я получаю 1.xx или 2.xx и т. Д., Но никогда в Java.
лямбда-это средняя скорость прибытия и варьируется от 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);
}