Numeri randomici in Java
DOMANDA:
Come si generano i numeri casuali (random) in Java?
RISPOSTA:
Come in tutti i linguaggi di programmazione, in Java i numeri non sono realmente casuali, ma pseudo-randomici. La non reale randomicità è dovuta al fatto che è comunque tutto basato su un algoritmo matematico.
Vediamo come generare dei numeri casuali da 1 a 1000:
package numerirandomici;
public class RandomTest1 {
public static void main(String[] args) {
int random = (int) (Math.random()*1000+1);
System.out.println(random);
}
}
public class RandomTest1 {
public static void main(String[] args) {
int random = (int) (Math.random()*1000+1);
System.out.println(random);
}
}
La spiegazione è semplice: Math.random() genera dei numeri casuali da 0 (compreso) a 1 (escluso). Il numero 1 costituisce il limite minimo dell'intervallo e 1000 quello massimo.
Facciamo qualche esempio reale:
Facciamo qualche esempio reale:
- Math.random() genera 0,200. Moltiplicando 0,2 * 1000 otteniamo 200, sommando 1 abbiamo 201;
- Math.random() genera 0,220. Moltiplicando 0,14 * 1000 otteniamo 140, sommando 1 abbiamo 141;
- Math.random() genera 0,000. Moltiplicando 0 * 1000 otteniamo 0, sommando 1 abbiamo 1;
- Math.random() genera 0,999. Moltiplicando 0,999 * 1000 otteniamo 999, sommando 1 abbiamo 1000.
Con Java 7 si può fare in una maniera più efficiente (due volte più veloce di Math.random()) grazie alla classe java.util.concurrent.ThreadLocalRandom:
package numerirandomici;
import java.util.concurrent.ThreadLocalRandom;
public class RandomTest2 {
public static void main(String[] args) {
int random1 = ThreadLocalRandom.current().nextInt(1, 5); // da 1 (compreso) a 5 (escluso)
double random2 = ThreadLocalRandom.current().nextDouble(1, 5); // da 1,00 (compreso) a 5,00 (escluso)
System.out.println(random1);
System.out.println(random2);
}
}
import java.util.concurrent.ThreadLocalRandom;
public class RandomTest2 {
public static void main(String[] args) {
int random1 = ThreadLocalRandom.current().nextInt(1, 5); // da 1 (compreso) a 5 (escluso)
double random2 = ThreadLocalRandom.current().nextDouble(1, 5); // da 1,00 (compreso) a 5,00 (escluso)
System.out.println(random1);
System.out.println(random2);
}
}
nota: la classe ThreadLocalRandom soffre di un bug (i numeri sono sempre uguali ad ogni esecuzione) risolto con l'update 2 della JDK e JRE 7.
Commenti
Posta un commento