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);
   }
}


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:

- 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);
   }
}

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

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java