Numeri casuali in java

La generazione di numeri casuali (pseudo-casuali) in java si può ottenere in due modi diversi. Nel primo caso si utilizza il metodo statico Math.random() che ritorna un valore double compreso tra 0.0 e 1.0. Vediamo un semplice esempio:
double v = Math.random();
Questo è un modo molto veloce per ottenere un valore random. Da questo valore poi è possibile ottenere un valore intero effettuando moltiplicazioni ed operazioni di cast. Se ad esempio desideriamo ottenere un intero compreso tra 0 e 10 basta moltiplicare il valore casuale generato - che è compreso tra 0.0 e 1.0 - per 10 ed effettuare il cast del risultato:
int n = (int)(Math.random()*10);
Il metodo Math.random() non fa altro che utilizzare un'istanza della classe Random del package java.util invocando il metodo nextDouble(). Ma vediamo nel dettaglio questa classe che implementa diverse funzionalità.

La classe Random

La classe java.util.Random ci mette a disposizione diversi metodi per la generazione di numeri o meglio valori casuali, poichè è possibile anche generare valori booleani. Per ogni tipo primitivo è disponibile un metodo che genera un valore random in base al tipo. Data un'istanza della classe Random:
Random random = new Random();
Possiamo ottenere:
  • un valore booleano:
    boolean b = random.nextBoolean();
    
  • un intero:
    int k = random.nextInt();
    
  • un intero compreso tra 0 e n (n positivo):
    int n = 10;
    int k = random.nextInt(n);//Valori compresi tra 0 e 10
    
    Se invece si desidera ottenere un intero casuale compreso tra j e n (ad esempio tra 3 e 10) basta aggiungere una somma:
    int j = 3;
    int n = 10-j;
    int k = random.nextInt(n)+j;//Valori compresi tra 3 e 10
    
  • un valore float compreso sempre tra 0.0 e 1.0:
    float f = random.nextFloat();
    
  • un valore long:
    long l = random.nextLong();
    
  • un valore double che non è altro che il metodo visto sopra poichè la classe Math utilizza questo metodo:
    doubke d = random.nextDoube();
    
  • il prossimo valore double di una distribuzione Gaussiana:
    double d = random.nextGaussian();
    
  • un array di byte:
    byte [] b = new byte[10];
    random.nextByte(b);
    
    Riempie l'array di byte generati in maniera casuale.
In più possiamo specificare anche il seed (il seme della sequenza) utilizzando un altro costruttore oppure il metodo setSeed():
long seed = 14567809;
Random r = new Random(seed);
...
r.setSeed(seed);
Il seed di un generatore di numeri casuali è un parametro fondamentale che serve all'algoritmo per generare i numeri casuali. Infatti, se si specifica lo stesso seed in due generatori diversi si ottengono le stesse sequenze di numeri casuali:
long seed = 10;
System.out.println("Prima sequenza");
Random r1 = new Random(seed);
for(int i = 0; i < 10; i++) {
 System.out.print(r1.nextInt(60)+",");
}
System.out.println();
System.out.println("Seconda sequenza");
Random r2 = new Random(seed);
for(int i = 0; i < 10; i++) {
 System.out.print(r2.nextInt(60)+",");
}

//Output
Prima sequenza
33,0,33,30,46,16,37,28,21,34,
Seconda sequenza
33,0,33,30,46,16,37,28,21,34,
Quindi se non si specifica il seed, Java utilizza come seed il timestamp di sistema in nanosecondi (System.nanoTime()) che quindi è sempre diverso ad ogni chiamata ed appunto verranno generate sempre sequenze diverse.
Altri link che potrebbero interessarti
  • » Utilizzare un JButton in Java Swing
  • » Utilizzare HTML in componenti Java Swing
  • » Modalità Full Screen Exclusive in java
  • » Leggere un file di testo in java
  • » Le variabili atomiche in java
  • » Le classi anonime
  • » Java Regex
  • » Java Database MySql
  • » Java Cursor Mouse
  • » Import Static Java
  • » Implementare un Singleton
  • » Implementare un KeyListener in java Swing
  • » Implementare il System.out su una JTextArea
  • » Il costrutto if in java
  • » Il costrutto foreach in java
  • » Il blocco static
  • » Creare una ToolBar in Java Swing
  • » Chiudere le applicazioni Java Swing
  • » Bordo con titolo in Java Swing
  • » Background Image per componenti Java Swing