Spiegazione Math.random ()


133

Questa è una domanda Java piuttosto semplice (sebbene probabilmente applicabile a tutta la programmazione):

Math.random() restituisce un numero compreso tra zero e uno.

Se voglio restituire un numero intero compreso tra zero e cento, farei:

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

Tra cento e cento, farei:

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

E se volessi ottenere un numero compreso tra tre e cinque? Sarà come la seguente dichiarazione:

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

So di nextInt()in java.lang.util.Random. Ma voglio imparare a farlo con Math.random().


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

9
A proposito: l'intervallo va da 0,0 incluso a 1,0 esclusivo (non otterrai mai 1.0 mai) L'uso di nextInt () è una scelta molto migliore, non solo è più semplice ma anche molto più veloce.
Peter Lawrey,

2
L'uso Math.ceilè errato, dà il risultato sbagliato quando Math.random()ritorna 0.
Starblue,

Cosa succede se Math.floor restituisce 0,029? Come ottenere sempre un numero di due cifre con una singola istruzione?
Naisheel Verdhan,

Risposte:


165
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 sono inclusivi, vale a dire [2,5], e mindevono essere inferiori rispetto maxall'esempio precedente.

EDIT: Se qualcuno stesse cercando di essere stupido e inverso mine max, potresti cambiare il codice in:

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

EDIT2: Per la tua domanda su doubles, è solo:

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

E ancora, se vuoi essere a prova di idiota, è 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 si utilizza (int)e si desidera che restituisca un double?
switz

Se vuoi raddoppiare, sostituisci semplicemente la ints con doubles (e il typecast non è necessario). Ho pensato che volessi ints, ma aggiungerò al mio post.
AusCBloke

2
In realtà con doubles rimuovere + 1anche poiché 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 inferiore a 1,0". Ci sarebbe comunque una minima possibilità che il numero sia esattamente, maxanche se fosse possibile.
AusCBloke

44

Se vuoi generare un numero compreso tra 0 e 100, il tuo codice sarebbe simile al seguente:

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

Per generare un numero da 10 a 20:

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

Nel caso generale:

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

(dove lowerboundè inclusivo ed upperboundesclusivo).

L'inclusione o l'esclusione di upperbounddipende dalla vostra scelta. Diciamo che range = (upperbound - lowerbound) + 1allora upperboundè inclusivo, ma se range = (upperbound - lowerbound)poi upperboundè esclusivo.

Esempio: se desidero un numero intero compreso tra 3-5, quindi se l'intervallo è (5-3) +1, allora 5 è inclusivo, ma se l'intervallo è solo (5-3), 5 è esclusivo.


2
upperboundesclusivo? Penso che sarà inclusivo.
Vidit,

1
@vidit è esclusivo

1
non pensare che stai ottenendo il quadro superiore in alto può essere neanche, come previsto nell'esempio
Teezy7

19

La Randomclasse di Java situata nel java.utilpacchetto servirà meglio al tuo scopo. Ha alcuni nextInt()metodi che restituiscono un numero intero. Chi prende un argomento int genererà un numero compreso tra 0 e quello int, quest'ultimo non incluso.


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

1

Per generare un numero compreso tra 10 e 20 inclusi, è possibile utilizzare java.util.Random

int myNumber = new Random().nextInt(11) + 10

0

Ecco un metodo che riceve i confini e restituisce un numero intero casuale. È leggermente più avanzato (completamente universale): i confini possono essere sia positivi che negativi e i limiti minimo / massimo possono arrivare in qualsiasi ordine.

int myRand(int i_from, int i_to) {
  return (int)(Math.random() * (Math.abs(i_from - i_to) + 1)) + Math.min(i_from, i_to);
}

In generale, trova la distanza assoluta tra i bordi, ottiene un valore casuale rilevante e quindi sposta la risposta in base al bordo inferiore.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.