2009-04-15 18 views
10

Da quello che ho capito, il generatore standard è per la distribuzione normale. Devo generare numeri casuali in base al normale, uniforme e di Poisson distribuzioni, ma io non riesco a trovare una classe per l'ultimo 2.Generatore Java per distribuzioni Poisson e uniformi?

devo generarli nel range di 0 - 999999.

risposta

5

In realtà, il standard generator è per la distribuzione uniforme. Il generatore di numeri casuali di base in qualsiasi lingua/libreria sarà sempre (in tutti i casi che conosco) utilizzare la distribuzione uniforme perché questo è ciò che esce da tutti gli algoritmi di generatore di numeri pseudocasuali popolari - in pratica, i numeri casuali uniformi sono i più facili.

vedo Eddie già indicò un link per altre distribuzioni quindi mi saltare scrivere il resto di questa ...

+0

In realtà, sembra che il collegamento indichi anche il metodo "nextGaussian" per creare anche le variabili normali. – gnovice

4

Lasciatemi prefazione tutto questo con il fatto che niente di tutto questo è veramente casuale, ho Sto parlando di generatori di numeri pseudo casuali.

Lasciatemi anche dire che non ho mai dovuto fare questo per il codice di qualità della produzione. Ho fatto questo per un compito hw, però, in Python. Ho simulato variabili casuali di Poisson.

Il modo in cui ho fatto fatto uso dei seguenti fatti:

  1. Una variabile casuale di Poisson è una somma di variabili aleatorie esponenziali.
  2. Possiamo utilizzare il metodo di trasformazione inversa per generare variabili casuali esponenziali. http://en.wikipedia.org/wiki/Inverse_transform_sampling.

In particolare, è possibile utilizzare il fatto che: se X 1 , ..., X n sono indipendenti normali variabili aleatorie esponenziali, allora Z = min (k: X + ... + X k < & lambda;) - 1 è Poisson (& lambda;).

Così, con questo, ho scritto il seguente codice in Python per generare valori di Poisson:

utilizzo
class Poisson: 
    """Generate Poisson(lambda) values by using exponential 
    random variables.""" 

    def __init__(self, lam): 
     self.__lam = lam 

    def nextPoisson(self): 
     sum = 0 
     n = -1 
     while sum < self.__lam: 
      n += 1 
      sum -= math.log(random.random()) 
     return n 

Esempio della classe è:

# Generates a random value that is Poisson(lambda = 5) distributed 
poisson = Poisson(5) 
poisson_value = poisson.nextPoisson 

ho postato qui perché è buono per sapere che esistono questi tipi di relazioni e questo metodo di trasformazione inversa ti offre un modo generale per affrontare la generazione di valori casuali seguendo una particolare distribuzione continua.

+0

Ho corretto la formattazione dell'elenco numerato in base a ciò che credo intendessi. Se questo non è ciò che intendevi, allora ovviamente sentiti libero di ripristinare il cambiamento. – Eddie

12

Come David ha sottolineato, il generatore di numeri pseudo-casuali fornito utilizza la distribuzione Uniform.

Per gli altri due, vorrei utilizzare le funzioni Cern Colt libreria:

Queste funzioni di libreria facilmente consentono di trovare un numero casuale tratto da ogni distribuzione, piuttosto che fornirti una funzione di densità di probabilità o una funzione di densità cumulativa e ti aspetti di ricavare il numero da te stesso (che sembra essere l'approccio Apache Commons-Math):

RandomEngine engine = new DRand(); 
Poisson poisson = new Poisson(lambda, engine); 
int poissonObs = poisson.nextInt(); 

Normal normal = new Normal(mean, variance, engine); 
double normalObs = normal.nextDouble(); 

Inoltre, tenere presente che la distribuzione di Poisson P (& lambda; può essere approssimato molto bene dalla normale distribuzione N (& lambda ;, sqrt (& lambda;)).

+0

C'è un modo per specificare il valore minimo e massimo che usano? Non sembra, da quello che ho visto. –

+0

Questo perché le distribuzioni di Poisson e Normale non hanno un valore massimo o minimo (beh, Poisson ha un minimo fisso di 0). –

+0

biblioteca molto bella, grazie! – peq

6

Il Java RNG standard (java.util.Random) e le sue sottoclassi come java.security.SecureRandom generano già valori distribuiti uniformemente.

Hanno anche un metodo, nextGaussian, che restituisce valori distribuiti normalmente. Per impostazione predefinita, la distribuzione ha una media di zero e una deviazione standard di 1, ma questo è banalmente ottimizzato. Basta moltiplicare per il richiesto s.d. e aggiungi la media richiesta. Così, per esempio, se si voleva valori normalmente distribuiti con una media di 6 e la deviazione standard di 2,5, si sarebbe fare questo:

double value = rng.nextGaussian() * 2.5 + 6; 

La distribuzione di Poisson non è esplicitamente supportata, ma si può fingere da facendo lo stesso come Tom's Python code.

In alternativa, potrebbe essere interessato al mio Uncommons Maths library, che fornisce classi di utilità per Normale, Poisson e altre distribuzioni.

+0

Il collegamento a Uncommon è 404. –

Problemi correlati