2012-03-15 15 views
9

Ho visto posti che spiega più o meno a questa domanda, ma tutti i valori interi utilizzati e sinceramente non lo comprendiamo pienamente, quindi, a questa domanda:Generazione di un doppio numero casuale di un certo intervallo in Java

sto cercando di generare numeri casuali nell'intervallo (-1554900.101) a (52952058699.3098) in Java e mi chiedevo se qualcuno potesse spiegarmi questo perché voglio davvero capirlo.

Le mie impressioni: sarà un approccio corretto? 1) Generare un numero intero casuale nell'intervallo specificato 2) Dividere il numero generato per pi per ottenere risultati float/doppi casuali

Grazie in anticipo.

+1

Voglio davvero conoscere le ragioni dietro quei limiti precisi :) – adelphus

+0

Con Java 7, c'è una risposta più semplice qui http://stackoverflow.com/a/32808589/1743880. – Tunaki

risposta

34

Ecco l'idea. Si desidera un numero casuale in un intervallo , ad esempio [-1.1,2.2], per iniziare con un semplice esempio. Tale intervallo ha lunghezza 3,3 dal 2.2 - (-1.1) = 3.3. Ora la maggior parte delle funzioni "casuali" restituisce un numero nell'intervallo [0,1), che ha la lunghezza uno, quindi dobbiamo ridimensionare il nostro numero casuale nel nostro intervallo desiderato.

Random random = new Random(); 
double rand = random.nextDouble(); 
double scaled = rand * 3.3; 

Ora il nostro numero a caso ha la grandezza che vogliamo, ma dobbiamo spostare nella linea numero per essere compreso tra i valori esatti che vogliamo. Per questo passaggio, abbiamo solo bisogno di aggiungere il limite inferiore dell'intero intervallo al nostro numero casuale in scala e abbiamo finito!

double shifted = scaled + (-1.1); 

Così ora siamo in grado di mettere queste parti insieme in una sola funzione:

protected static Random random = new Random(); 
public static double randomInRange(double min, double max) { 
    double range = max - min; 
    double scaled = random.nextDouble() * range; 
    double shifted = scaled + min; 
    return shifted; // == (rand.nextDouble() * (max-min)) + min; 
} 

Naturalmente, questa funzione ha bisogno di un po 'di controllo degli errori per i valori inaspettati come NaN ma questa risposta dovrebbe illustrare l'idea generale.

+0

Se sto usando 'Double.MAX_VALUE' vs' Double.MIN_VALUE', non riga 3 nel tuo l'ultimo frammento è fuori portata? – SOFe

7
double lower = -1554900.101; 
double upper = 52952058699.3098; 
double result = Math.random() * (upper - lower) + lower; 
+0

Ma OP sta cercando una * spiegazione *, non una traduzione da 'int' a' double' types ... – maerics

2

Dovrebbe essere qualcosa di simile:

double rnd = Math.random(); 

double result = ((long)(rnd * (529520586993098L - (-15549001010L) + 1)) -15549001010L)/10000.0; 

Il + 1 sarà equilibrio per il fatto che la gamma è così [0;1[ gamma superiore è esclusa.

Per prima cosa cerchiamo di trovare un "intero" (molto lungo) Campo e aggiungiamo 1 per bilanciare il fatto che l'ultimo numero è escluso, in modo 529520586993098L + 15549001010L + 1, poi moltiplicarlo per rnd, gettarlo ai long e sottrarre 15549001010L per spostarlo indietro e alla fine dividerlo per 10000.0 per farlo nella giusta "gamma".

Questo è probabilmente più chiara:

long range = 529520586993098L + 15549001010L + 1; 

double temp = rnd * range; 
long temp2 = (long)temp; 
temp2 -= 15549001010L; 

double result = temp2/10000.0; 
2

Questo non è come lo farei.

  • Genera un doppio casuale. Il risultato è compreso tra 0 e 1.
  • Moltiplica questo numero per (HighLimit - LowLimit) (52952058699,3098 - -1.554.900,101)
  • Aggiungere il lowlimit (casuale + -1554900,101)

Qui si va. Hai un numero casuale tra limite inferiore e limite alto.

1

Random.nextDouble restituisce un double nel range [0, 1 [in modo da utilizzare che, si moltiplicano con la dimensione gamma (52952058699,3098 + 1.554.900,101) e poi compensare il risultato (sottrarre 1.554.900,101) per ottenere il tuo numero.

Non sono sicuro di quanto esatto sia necessario, tuttavia, senza eseguire ulteriori analisi, è possibile ottenere numeri al di fuori dell'intervallo a causa del modo in cui vengono gestiti i doppi.

Problemi correlati