Генератор 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. Я имитировал случайные переменные Пуассона.
Как я это сделал, использовали следующие факты:
В частности, вы можете использовать тот факт, что: если 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
Я разместил это здесь, потому что хорошо знать, что существуют такие отношения, и этот метод обратного преобразования дает вам общий способ обработки случайных значений после определенного непрерывного распределения.