Pergunta

eu estive olhando em volta, mas não tenho certeza de como fazê-lo.

eu encontrei nesta página que, no último parágrafo, diz:

Um simples gerador de números aleatórios tomadas a partir de uma distribuição de Poisson é obtido usando esta simples receita:se x1, x2, ...é uma sequência de números aleatórios com distribuição uniforme entre zero e um, k é o primeiro número inteiro para o qual o produto x1 · x2 · ...· xk+1 < e

eu encontrei outra página descrevendo como gerar números binomiais, mas eu acho que ele está usando uma aproximação de poisson geração, o que não me ajuda.

Por exemplo, considere binomial de números aleatórios.Uma aleatória binomial número é o número de cabeças em N jogadas de uma moeda com probabilidade p de um cabeças em um único lance.Se você gerar N uniforme de números aleatórios no intervalo (0,1) e contar o número menor do que p, então a contagem é um binômio número aleatório com parâmetros N e p.

eu sei que existem bibliotecas para fazer isso, mas eu não posso usá-los, apenas o padrão uniforme de geradores fornecidos pela linguagem (java, neste caso).

Foi útil?

Solução

Distribuição de veneno

Aqui está Como a Wikipedia diz que Knuth diz para fazer isso:

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.

Em Java, isso seria:

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;
}

Distribuição binomial

Indo até o capítulo 10 de Geração de variada aleatória não uniforme (Pdf) por Luc Devroye (que eu encontrei vinculado O artigo da Wikipedia) dá isso:

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;
}

Observe

Nenhum desses algoritmos é ideal. O primeiro é O (λ), o segundo é O (n). Dependendo do tamanho desses valores normalmente e da frequência que você precisa chamar de geradores, pode precisar de um algoritmo melhor. O artigo para o qual o link acima tem algoritmos mais complicados que são executados em tempo constante, mas deixarei essas implementações como um exercício para o leitor. :)

Outras dicas

Para este e outros problemas numéricos, a Bíblia é o livro de receitas numéricas.

Há uma versão gratuita para C aqui: http://www.nrbook.com/a/bookcpdf.php (Plugin necessário)

Ou você pode vê -lo nos livros do Google: http://books.google.co.uk/books?id=4t-sybvUoqoc&lpg=pp1&ots=5ihminlHho&dq=numerical%20Recipes%20in%20C&PG=pp1#v=Onepage&f=&FalFalse

O código C deve ser muito fácil de transferir para o Java.

Este livro vale o peso em ouro para muitos problemas numéricos. No site acima, você também pode comprar a versão mais recente do livro.

Embora a resposta postado por Kip é perfeitamente válida para a geração de Poisson RVs com pequena taxa de chegadas (lambda), o segundo algoritmo postado na Wikipédia A geração de Poisson; variáveis Aleatórias é melhor para a maior taxa de chegadas devido à estabilidade numérica.

Eu enfrentou problemas durante a execução de um dos projetos que requerem a geração de Poisson RV com muito alto lambda devido a isso.Então eu sugiro que o outro.

Existem várias implementações do CERN na seguinte biblioteca (código Java):

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

Em relação aos números aleatórios binomiais, baseia -se no artigo de 1988 "geração de variados aleatórios binomiais", que eu recomendo, pois eles usam um algoritmo otimizado.

Cumprimentos

você pode adicionar isso ao build.gradle

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

e use a classe Distribuição de veneno Mais detalhes para a Poissondistribuição de classe

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top