Генератор Java для пуассоновских и унифицированных распределений?

Из того, что я понимаю, стандартный генератор предназначен для нормального распределения. Я должен генерировать случайные числа в соответствии с нормальными, униформными и пуассоновскими распределениями, но я не могу найти класс для последних 2.

Мне нужно сгенерировать их в диапазоне от 0 до 999999.

Ответ 1

Как указал Давид, генератор псевдослучайных чисел, поставляемый в комплекте, использует равномерное распределение.

Для двух других я использовал функции Cern Colt:

Эти функции библиотеки легко позволяют вам найти случайное число, взятое из каждого распределения, вместо того, чтобы давать вам функцию плотности вероятности или функцию совокупной плотности и рассчитывать на то, что вы сами получите номер (что похоже на подход Apache Commons-Math ):

RandomEngine engine = new DRand();
Poisson poisson = new Poisson(lambda, engine);
int poissonObs = poisson.nextInt();

Normal normal = new Normal(mean, variance, engine);
double normalObs = normal.nextDouble();

Кроме того, учтите, что распределение Пуассона P (& lambda;) для больших & lambda; очень хорошо аппроксимируется нормальным распределением N (& lambda;, sqrt (& lambda;)).

Ответ 2

Стандартный Java RNG (java.util.Random) и его подклассы, такие как java.security.SecureRandom, уже генерируют равномерно распределенные значения.

У них также есть метод nextGaussian, который возвращает нормально распределенные значения. По умолчанию распределение имеет значение 0 и стандартное отклонение 1, но это тривиально изменено. Просто умножьте требуемый s.d. и добавьте требуемое среднее значение. Так, например, если вы хотите нормально распределенные значения со средним значением 6 и стандартным отклонением 2,5, вы бы это сделали:

double value = rng.nextGaussian() * 2.5 + 6;

Распределение Poisson явно не поддерживается, но вы можете подделать его, выполнив то же самое, что и код Tom Python.

В качестве альтернативы вам может быть интересна моя Необычная библиотека Maths, которая предоставляет классы утилиты для Normal, Poisson и других дистрибутивов.

Ответ 3

Фактически, стандартный генератор предназначен для равномерного распределения. Генератор случайных чисел в любом языке/библиотеке всегда (во всех случаях, я знаю) использует равномерное распределение, потому что то, что вышло из всех популярных алгоритмов псевдослучайного генератора чисел - в основном, простые случайные числа являются самыми легкими.

Я вижу, что Эдди уже указал вам ссылку на другие дистрибутивы, поэтому я пропущу запись остальной части этого...

Ответ 4

Позвольте мне изложить все это тем, что ни одно из этого не является действительно случайным, я говорю о генераторах псевдослучайных чисел.

Позвольте мне также сказать, что мне никогда не приходилось делать это для кода качества продукции. Я сделал это для назначения hw, хотя в Python. Я имитировал случайные переменные Пуассона.

Как я это сделал, использовали следующие факты:

  • Случайная величина Пуассона представляет собой сумму экспоненциальных случайных величин.
  • Мы можем использовать метод обратного преобразования для генерации экспоненциальных случайных величин. http://en.wikipedia.org/wiki/Inverse_transform_sampling.

В частности, вы можете использовать тот факт, что: если X 1,..., X n - независимые стандартные экспоненциальные случайные величины, то Z = min (k: X 1 +... + X k < & lambda;) - 1 является пуассоном (& lambda;).

Итак, с этим я написал следующий код в python для генерации значений Пуассона:

class Poisson:
    """Generate Poisson(lambda) values by using exponential
    random variables."""

    def __init__(self, lam):
        self.__lam = lam

    def nextPoisson(self):
        sum = 0
        n = -1
        while sum < self.__lam:
            n += 1
            sum -= math.log(random.random())
        return n

Пример использования класса:

# Generates a random value that is Poisson(lambda = 5) distributed
poisson = Poisson(5)
poisson_value = poisson.nextPoisson

Я разместил это здесь, потому что хорошо знать, что существуют такие отношения, и этот метод обратного преобразования дает вам общий способ обработки случайных значений после определенного непрерывного распределения.