2010-10-10 35 views
5

Voglio generare alcuni numeri interi casuali in Java, ma questo secondo alcune leggi di distribuzione. più specifiche:Generatore di numeri casuali che genera numeri interi per Java

  • voglio generare alcuni numeri interi casuali per la distribuzione gaussiana. Ho scoperto solo generatori che restituiscono risultati doppi per la distribuzione gaussiana. Perché?

  • Voglio generare alcuni numeri interi casuali tra alcuni limiti per la distribuzione esponenziale? Qui ho anche scoperto solo i generatori che restituiscono il doppio. Inoltre, non ho trovato un modo per generare numeri esponenziali casuali solo tra due limiti.

Potete aiutarmi? Conosci una biblioteca che può fare ciò che voglio? Ho studiato biblioteca di Michael Flanagan, colt e apache's Commons Math ma non hanno ciò di cui ho bisogno.

Grazie!

risposta

-1

Basta generare un doppio e ridimensionarlo all'intervallo intero richiesto. Ad esempio, se un normale generatore di numeri casuali (uniforme) genera numeri da 0.0 a 1.0 e vuoi numeri da 0 a 100, devi solo moltiplicare il numero casuale generato per 100.

+2

ma sarà comunque distribuito uniformemente anziché gaussiano. –

+0

sì sì il doppio generatore è stato distribuito uniformemente, se ha avuto una distribuzione gaussiana anche l'intervallo intero avrà una distribuzione gaussiana. – flownt

+0

Perché il downvote? L'OP ha detto di avere un generatore di numeri casuali gaussiano. Sottolineo che il numero può essere tradotto da una distribuzione gaussiana a un'altra. Non riesco a ricordare la matematica, ma è una trasformazione semplice. – dty

2

Se hai un numero doppio da Da 0 a 1 è possibile ridimensionarlo all'intero:

int res = lowLimit + (int) (myRandFunction() * (highLimit - lowLimit));

Edit:

Perché ho ricevuto un voto verso il basso? Lui è triste perché ha una funzione che restituisce un doppio nella distribuzione che vuole (ho indovinato un doppio modulo da 0 a 1), quindi questo farà il lavoro.

+0

Com'è distribuito gaussiano o esponenzialmente? NOTA: non sono il downvoter. –

+0

se myRandFunction() restituisce numeri nella distribuzione gaussiana da 0 a 1 questo restituirà interi distribuiti gaussiani. – Klark

+0

(anche non in downvoting) Non esiste qualcosa come interi distribuiti gaussiani. La distribuzione gaussiana (normale) è valida solo nel contesto di intervalli continui. La distribuzione discreta più simile è binomiale. – Rekin

-1

boost ha alcuni simpatici generatori di numeri casuali, conosco il suo C++ e non java, ma le implementazioni dovrebbero essere una buona guida per implementarle da soli.

http://www.boost.org/doc/libs/1_43_0/doc/html/boost_random.html

+0

perchè tutte le risposte sono state downvoted ?? – flownt

+1

Non l'ho fatto, ma lo penso perché nessuno di loro risponde veramente alla domanda. –

+0

@Colin Hebert, non è difficile farlo da soli approssimativamente gaussiano: rand()/4 + rand()/4 + rand()/4 + rand()/4 poiché la distribuzione binomiale si avvicina alla distribuzione normale, questo dovrebbe generare una distribuzione binomiale tra 0 e l'output massimo di rand() – flownt

3

suggerisco di utilizzare la libreria Uncommons Maths, che comprende diversi generatori casuali (ad esempio Mersenne Twister, basata su AES) e le distribuzioni (poisson, Controllo e così via)

Per quanto riguarda il " doppio problema ": quasi tutti i generatori casuali generano il doppio perché sono i più usati. Se hai bisogno di numeri interi dovrai eseguire personalmente l'arrotondamento (una chiamata allo Math.round sarà sufficiente). Diciamo che stai generando altezze di persone casuali con precisione centimetrica: se il tuo generatore casuale restituisce 175.234, puoi arrotondarlo a 175. Questo non è un problema.

Per quanto riguarda i limiti per la distribuzione esponenziale: non ci sono generatori che consentono di scegliere i limiti perché non esistono limiti di questo tipo per la distribuzione esponenziale. Una distribuzione esponenziale di solito modella i ritardi tra due eventi consecutivi in ​​un processo di Poisson: il ritardo può arrivare fino a 0, o può essere estremamente alto. I risultati estremamente alti sono davvero improbabili, ma non sono impossibili. puoi risolvere il problema ottenendo un numero casuale dal generatore, aggiungendo il limite inferiore e usando Math.max per tagliarlo se è superiore al limite superiore. Ma questa non è più una distribuzione esponenziale.

Problemi correlati