Domanda

Mi sono guardato intorno, ma non sono sicuro di come farlo.

ho trovato questa pagina Che, nell'ultimo paragrafo, dice:

Un semplice generatore per numeri casuali prelevati da una distribuzione di Poisson si ottiene usando questa semplice ricetta: se x1, X2, ... è una sequenza di numeri casuali con distribuzione uniforme tra zero e uno, k è il primo intero per il quale il prodotto x1 · X2 · ... · XK+1 <e

ho trovato Un'altra pagina Descrivere come generare numeri binomiali, ma penso che stia usando un'approssimazione della generazione di Poisson, che non mi aiuta.

Ad esempio, considera i numeri casuali binomiali. Un numero casuale binomiale è il numero di teste in n lanci di una moneta con probabilità p di una testa su ogni singolo lancio. Se si generano N numeri casuali uniformi sull'intervallo (0,1) e contano il numero inferiore a P, allora il conteggio è un numero casuale binomiale con parametri n e p.

So che ci sono librerie da farlo, ma non posso usarle, solo i generatori uniformi standard forniti dalla lingua (Java, in questo caso).

È stato utile?

Soluzione

Distribuzione di Poisson

Ecco Come dice Wikipedia:

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.

In Java, quello sarebbe:

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

Distribuzione binomiale

Andando nel capitolo 10 di Generazione di variate casuali non uniforme (PDF) di Luc Devroye (da cui ho trovato collegato L'articolo di Wikipedia) dà questo:

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

notare che

Nessuno di questi algoritmi è ottimale. Il primo è O (λ), il secondo è O (n). A seconda di quanto sono in genere grandi questi valori e con quale frequenza è necessario chiamare i generatori, potresti aver bisogno di un algoritmo migliore. Il documento che collego al di sopra ha algoritmi più complicati che funzionano in tempo costante, ma lascerò quelle implementazioni come esercizio per il lettore. :)

Altri suggerimenti

Per questo e altri problemi numerici la Bibbia è il libro delle ricette numeriche.

C'è una versione gratuita per C qui: http://www.nrbook.com/a/bookcpdf.php (plugin richiesto)

Oppure puoi vederlo sui libri di 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

Il codice C dovrebbe essere molto facile da trasferire a Java.

Questo libro vale il suo peso in oro per molti problemi numerici. Sul sito sopra puoi anche acquistare l'ultima versione del libro.

Sebbene la risposta pubblicata da KIP sia perfettamente valida per la generazione di RV Poisson con un piccolo tasso di arrivi (Lambda), il secondo algoritmo pubblicato in Wikipedia Generare variabili casuali di Poisson è meglio per un maggiore tasso di arrivi a causa della stabilità numerica.

Ho affrontato problemi durante l'implementazione di uno dei progetti che richiedono la generazione di camper Poisson con Lambda molto elevato a causa di ciò. Quindi suggerisco l'altro modo.

Esistono diverse implementazioni del CERN nella seguente libreria (codice Java):

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

Per quanto riguarda i numeri casuali binomiali, si basa sul documento del 1988 "generazione di variate casuali binomiali", che ti consiglio poiché usano un algoritmo ottimizzato.

Saluti

Puoi aggiungerlo a build.gradle

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

e usa la classe Poissondution Maggiori dettagli per la classe Poissondution

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top