La generazione di numeri casuali in Java

La soluzione di un problema può, a volte, richiedere di eseguire alcune azioni in modo casuale.
Spesso, per questo tipo di necessità, si ricorre alla generazione di numeri casuali.
Un numero è detto casuale quando il suo valore è determinato da una apposita funzione, che restituisce numeri differenti ad ogni invocazione.

In Java questa funzione si chiama Math.random.

La funzione Math.random genera numeri casuali maggiori o uguali a 0 e minori di 1, quindi valori compresi nell'intervallo 0 ... 0,9999999999999...

Vediamo ora come tale funzione può essere utilizzata per generare numeri compresi in intervalli specifici.

Per generare numeri dell'intervallo 0 ... 9 (estremi compresi) occorrerà eseguire l'istruzione

int casuale_0_9 = (int)(Math.random() * 10)

Per generare numeri dell'intervallo 1 ... 10 (estremi compresi) occorrerà eseguire l'istruzione

int casuale_1_10 = 1 + (int)(Math.random() * 10)

Per generare numeri dell'intervallo 101 ... 150 (estremi compresi) occorrerà eseguire l'istruzione

int casuale_101_150 = 101 + (int)(Math.random() * 50)

In generale, ogni volta che dobbiamo generare numeri in un intervallo determinato da un valore minimo (min) ed un valore massimo (max), dobbiamo considerare i due dati che seguono:

  • il valore minimo (min) dell'intervallo
  • la quantità (qta) di numeri dell'intervallo, ossia la differenza tra il valore massimo ed il valore minimo, incrementata di uno.

Nell'esempio precedente dei numeri dell'intervallo 101 ... 150, il valore minimo (min) è uguale a 101 e la quantità (qta) è uguale alla differenza tra 150 e 101, più 1, ossia 150-101+1=50.

In conclusione possiamo definire le seguenti formule generiche:

// se calcoliamo qta come segue
int qta = max - min + 1;

// possiamo generare un numero casuale
// intero nell'intervallo min ... max
// con la formula seguente
int casuale_min_max = min + (int)(Math.random() * qta);

// oppure sostituendo il valore di qta
// con la sua espressione
int casuale_min_max = min + (int)(Math.random() * (max - min + 1));

Un metodo alternativo alla funzione Math.random, in Java, fa uso della classe Random.
La classe Random possiede la funzionalità nextInt per generare un numero intero tra 0 ed un valore passato come parametro.
Per generare quindi i numeri compresi tra 0 e 99 è sufficiente usare le istruzioni che seguono:

Random rnd = new Random();
int casuale_0_99 = rnd.nextInt(100);

Analogamente a quanto visto in precedenza, quindi, per generare i numeri di un generico intervallo min ... max occorre utilizzare le istruzioni che seguono:

Random rnd = new Random();
int casuale_min_max = min + rnd.nextInt(max - min + 1);
Nota:
L'utilizzo della classe Random richiede, nel package, la presenza della seguente istruzione di import:
import java.util.Random;