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.
Voglio davvero conoscere le ragioni dietro quei limiti precisi :) – adelphus
Con Java 7, c'è una risposta più semplice qui http://stackoverflow.com/a/32808589/1743880. – Tunaki