Wie erstelle ich diskrete zufällige Ereignisse einer Poisson-Verteilung?
Ich bin mir dessen bewusst, Knuth ' s Algorithmus zur Generierung von Zufallszahlen Poisson-verteilten zahlen (unten in Java), aber wie übersetze ich das in eine Methode aufrufen, generateEvent()
zufällig im Laufe der Zeit?
int poissonRandomNumber(int lambda) {
double L = Math.exp(-lambda);
int k = 0;
double p = 1;
do {
k = k + 1;
double u = Math.random();
p = p * u;
} while (p > L);
return k - 1;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie schauen, um zu simulieren, die inter-event-Ankunft Zeit, die Sie wollen, dass die exponentielle Verteilung.
Werfen Sie einen Blick auf Pseudo-Zufälligen Nummern-Generator - Exponentielle Verteilung
Dein code würde dann wie folgt Aussehen:
...
poissonRandomInterarrivalDelay()
ist fehlerhaft. Wie es geschrieben wird, negative Ergebnisse erzielen, wennMath.random()
erzeugt einen Wert von weniger alsMath.exp(-lambda)
. Eine korrekte Umsetzung ist:return Math.log(1.0-Math.random())/-lambda;
. Sie vereinfachen das zureturn Math.log(Math.random())/-lambda;
seit1.0-Math.random()
ist gleichmäßig verteilt zwischen 0 und 1.Die Poisson-Zufallszahlen, die Sie generieren, wie in Scott erwähnt, stellen Sie die Häufigkeit der Ereignisse. Sobald Sie die Frequenz, Sie können passen Ihre vorkommen über dem Intervall mit einer zweiten Verteilung, sagen Einheitlich.
Nehme an, dass die Anzahl der Ereignisse, die generiert werden für ein Intervall von N ist k. Dann müssen Sie einfach zu generieren (k+1) zufällige zahlen, die Summe bis N.
|<----------------------- N ------------------------->|
--r_0--(Ereignis)---r_1-..-(event_k)--r_(k+1)--
Dazu einfach generieren (k+1) Zufallszahlen und teilen Sie Sie durch Ihre Summe geteilt durch N. Die ersten k dieser zahlen werden die Zeitstempel der Ereignisse.