2011-11-01 16 views
97

Questo è un piuttosto semplice Java (anche se probabilmente applicabile a tutta la programmazione) domanda:Math.random() ha spiegato

Math.random() restituisce un numero da zero a uno.

Se voglio tornare un numero intero da zero a cento, lo farei:

(int) Math.floor(Math.random() * 101) 

Da uno a cento, lo farei:

(int) Math.ceil(Math.random() * 100) 

Ma cosa succede se volevo farlo da tre a cinque? Sarà come seguente dichiarazione:

(int) Math.random() * 5 + 3 

che so di nextInt() in java.lang.util.Random. Ma voglio imparare come farlo con Math.random().

+8

BTW: l'intervallo è da 0.0 compreso a 1.0 esclusivo (non otterrete mai 1.0 in assoluto). L'uso di nextInt() è una scelta di gran lunga migliore, non solo è più semplice ma anche molto più veloce. –

+1

L'uso di 'Math.ceil' è sbagliato, dà il risultato sbagliato quando' Math.random() 'restituisce' 0'. – starblue

+0

Per [3,5]: '(int) Math.floor (Math.random() * 3) + 3' –

risposta

130
int randomWithRange(int min, int max) 
{ 
    int range = (max - min) + 1;  
    return (int)(Math.random() * range) + min; 
} 

uscita di randomWithRange(2, 5) 10 volte:

5 
2 
3 
3 
2 
4 
4 
4 
5 
4 

I limiti includono, cioè [2,5], e min devono essere inferiori max nell'esempio precedente.

EDIT: Se qualcuno stava per cercare di essere stupido e invertire min e max, è possibile modificare il codice per:

int randomWithRange(int min, int max) 
{ 
    int range = Math.abs(max - min) + 1;  
    return (int)(Math.random() * range) + (min <= max ? min : max); 
} 

EDIT2: Per le tue domande su double s, è solo :

double randomWithRange(double min, double max) 
{ 
    double range = (max - min);  
    return (Math.random() * range) + min; 
} 

E ancora, se si desidera prova di idiota-it è solo:

double randomWithRange(double min, double max) 
{ 
    double range = Math.abs(max - min);  
    return (Math.random() * range) + (min <= max ? min : max); 
} 
+1

Cosa succede se non usi '(int)' e vuoi che restituisca un 'double'? – switz

+0

Se si desidera il doppio, basta sostituire 'int's con' double's (e il typecast non è necessario). Ho pensato che volevi "int" ma aggiungerò al mio post. – AusCBloke

+1

In realtà con 'double's rimuovi' + 1' anche perché 'Math.random()' non viene troncato. Tuttavia, l'intervallo sarà [min, max] poiché 'Math.random'" restituisce un doppio valore con un segno positivo, maggiore o uguale a 0.0 e minore di 1.0. " Ci sarebbe una minima possibilità che il numero fosse esattamente "max" in ogni caso, anche se fosse possibile. – AusCBloke

17

La classe Random di Java che si trova nel pacchetto java.util servirà meglio al tuo scopo. Ha alcuni metodi nextInt() che restituiscono un intero. Quello che prende un argomento int genererà un numero compreso tra 0 e int, quest'ultimo non compreso.

+0

Ho aggiornato la mia domanda, mi piacerebbe sapere come farlo con 'Math.random()'. Grazie. – switz

+0

+1 per il modo più affidabile di farlo. – trashgod

36

Se si desidera generare un numero da 0 a 100, allora il codice sarebbe simile a questa:

(int)(Math.random() * 101); 

generare un numero da 10 a 20:

(int)(Math.random() * 11 + 10); 

In generale caso:

(int)(Math.random() * ((upperbound - lowerbound) + 1) + lowerbound); 

(dove lowerbound è inclusiva e upperbound exclu sive).

L'inclusione o l'esclusione di Uppderbound dipende dalla vostra scelta. Diciamo che Range = (Uppderbound-lowerbound) +1 then the Uppderbound is Inclusive.ma se Range = (Uppderbound-lowerbound) allora Uppderbound è Exclusive. Es: Se voglio intero in bianco e nero 3-5, se l'intervallo è (5-3) +1, 5 è compreso, se l'intervallo è solo (5-3), quindi 5 è esclusivo.

+2

"upperbound' exclusive? Penso che sarà comprensivo. – vidit

+0

@vidit è esclusivo –

Problemi correlati