Sono a conoscenza dell'algoritmo di Knuth per la generazione di numeri distribuiti casuali di Poisson (di seguito in Java) ma come faccio a tradurlo nel chiamare un metodo, generateEvent()
, casualmente nel tempo?Come posso generare eventi casuali discreti con una distribuzione di Poisson?
risposta
Se si desidera simulare l'orario di arrivo tra gli eventi, si desidera la distribuzione esponenziale.
Date un'occhiata a Pseudorandom Number Generator - Exponential Distribution
il codice sarà quindi simile a questa:
// Note L == 1/lambda
public double poissonRandomInterarrivalDelay(double L) {
return (Math.log(1.0-Math.random())/-L;
}
...
while (true){
// Note -- lambda is 5 seconds, convert to milleseconds
long interval= (long)poissonRandomInterarrivalDelay(5.0*1000.0);
try {
Thread.sleep(interval);
fireEvent();
}
I numeri casuali Poisson si sta generando, come detto Scott, rappresenta la frequenza dei tuoi eventi. Una volta ottenuta la frequenza, puoi adattare le loro occorrenze all'intervallo utilizzando una seconda distribuzione, ad esempio Uniforme.
Supponiamo che il numero di eventi generati per un intervallo di N sia k. Quindi è sufficiente generare (k + 1) numeri casuali che sommano a N.
| < ----------------------- N ------------------------- > |
--r_0 - (evento) --- r_1 -..- (evento_k) - r_ (k + 1) -
Per fare ciò, è sufficiente generare (k + 1) numeri casuali e dividere li per la loro somma, divisa per N. Il primo k di questi numeri diventa il timestamp dei tuoi eventi.
Ciao, ho bisogno di generare numeri casuali nella frequenza di intervallo di Poisson usando java .. Ho provato a usare la tua funzione e il metodo poissonRandomInterarrivalDelay restituisce sempre zero per qualsiasi valore di lambda. – Learner
Puoi pubblicare il tuo codice come una nuova domanda? Forse posso vedere qualcosa ... –
Non riesco a farlo. Al momento sono bloccato .. – Learner