Алгоритм генерации пуассоновских и биномиальных случайных чисел?

Я смотрел вокруг, но не знаю, как это сделать.

я нашел эту страницу, на которой в последнем абзаце сказано:

Простой генератор случайных чисел, взятых из распределения Пуассона, получается с использованием этого простого рецепта: если x 1, x 2, ... представляет собой последовательность случайных чисел с равномерным распределением между нулем и единицей, k - первое целое число, для которого произведение x 1 · x 2 · ... · x k + 1 < / sub> ‹e

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

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

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


person Community    schedule 06.08.2009    source источник
comment
В книге Числовые рецепты (3-е издание) есть полное объяснение генерации пуассоновских и биномиальных отклонений.   -  person Donnie DeBoer    schedule 07.08.2009
comment
Некоторые другие доступные библиотеки приведены здесь:   -  person    schedule 28.09.2012


Ответы (5)


распределение Пуассона

Вот как Википедия говорит, что Кнут велит это делать:

init:
     Let L ← e^(−λ), k ← 0 and p ← 1.
do:
     k ← k + 1.
     Generate uniform random number u in [0,1] and let p ← p × u.
while p > L.
return k − 1.

В Java это будет:

public static int getPoisson(double lambda) {
  double L = Math.exp(-lambda);
  double p = 1.0;
  int k = 0;

  do {
    k++;
    p *= Math.random();
  } while (p > L);

  return k - 1;
}

Биномиальное распределение

Следуя главе 10 Генерация неравномерной случайной переменной (PDF) Люк Деврой (на который я нашел ссылку в статье в Википедии) дает следующее:

public static int getBinomial(int n, double p) {
  int x = 0;
  for(int i = 0; i < n; i++) {
    if(Math.random() < p)
      x++;
  }
  return x;
}

Пожалуйста, обрати внимание

Ни один из этих алгоритмов не является оптимальным. Первый - O (λ), второй - O (n). В зависимости от того, насколько велики эти значения и как часто вам нужно вызывать генераторы, вам может потребоваться лучший алгоритм. В документе, на который я ссылаюсь выше, есть более сложные алгоритмы, которые работают в постоянное время, но я оставлю эти реализации в качестве упражнения для читателя. :)

person Kip    schedule 06.08.2009
comment
@Kip В вашем первом примере L обозначает Lambda, что означает P? - person Akshat Agarwal; 27.01.2016
comment
@AkshatAgarwal На самом деле L означает e ^ (- lambda). p - это просто число от 0 до 1. На каждой итерации оно уменьшается на случайную величину (когда оно умножается на случайное число от 0 до 1), пока вы не дойдете до точки, в которой p меньше L. Чем больше лямбда, тем меньше (ближе к 0) L будет, то есть чем больше итераций цикла мы пройдем в среднем до того, как p станет меньше L. - person Kip; 28.01.2016
comment
Есть ли ограничение на lambda? Когда я набираю 1000 или 2000 баллов, я получаю в среднем 745 результатов. Если я пропущу меньшие числа, результаты кажутся правильными. - person isapir; 27.11.2018

Для этой и других числовых задач Библия - это книга числовых рецептов.

Здесь есть бесплатная версия для C: http://www.nrbook.com/a/bookcpdf.php (требуется плагин)

Или вы можете увидеть это в книгах Google: http://books.google.co.uk/books?id=4t-sybVuoqoC&lpg=PP1&ots=5IhMINLhHo&dq=numerical%20recipes%20in%20c&pg=PP1#v=onepage&q=&f=false

Код C должен быть очень легко перенесен на Java.

Эта книга на вес золота из-за множества числовых задач. На указанном выше сайте вы также можете купить последнюю версию книги.

person Pablojim    schedule 07.08.2009
comment
Книга «Числовые рецепты» не бесплатна. У вас должен быть пароль, чтобы разблокировать файлы PDF. - person Jay R.; 11.03.2010

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

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

person Ashutosh Gupta    schedule 10.07.2015

В следующей библиотеке (код Java) есть несколько реализаций от CERN:

http://acs.lbl.gov/~hoschek/colt/

Что касается биномиальных случайных чисел, он основан на статье 1988 г. «Генерация биномиальных случайных величин», которую я рекомендую вам, поскольку они используют оптимизированный алгоритм.

С Уважением

person Miguel Ángel Martínez    schedule 26.01.2010

вы можете добавить это в build.gradle

implementation 'org.kie.modules:org-apache-commons-math:6.5.0.Final'

и используйте класс PoissonDistribution подробнее о классе PoissonDistribution

person abolfazl bazghandi    schedule 17.05.2019