Генератор Java для Пуассона и равномерных распределений? - PullRequest
10 голосов
/ 15 апреля 2009

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

Я должен генерировать их в диапазоне от 0 до 999999.

Ответы [ 4 ]

12 голосов
/ 15 апреля 2009

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

Для двух других я бы использовал библиотечные функции 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;)).

6 голосов
/ 16 апреля 2009

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

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

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

Распределение Пуассона явно не поддерживается, но вы можете подделать его, выполнив то же самое, что и Код Тома Python .

Кроме того, вас может заинтересовать моя библиотека Uncommons Maths , которая предоставляет служебные классы для нормальных, пуассоновских и других дистрибутивов.

5 голосов
/ 15 апреля 2009

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

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

4 голосов
/ 15 апреля 2009

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

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

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

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

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

Итак, я написал следующий код на 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...