Экспоненциальное распределение в Java не верно - значения слишком малы? - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь сгенерировать экспоненциальное распределение для времени прибытия и обслуживания процессов. В 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);
}
...