Press "Enter" to skip to content

La funzione random java

Quando si programma potrebbe essere necessario dover generare uno o più numeri random. Per fare questo ogni linguaggio ha le sue classi, funzioni e sintassi. In questo articolo vedremo come generare numeri random in java.

Per generare numeri casuali in java esistono diversi modi, utilizzando diverse classi in base alle proprie esigenze.

La classe ThreadLocalRandom

Il modo più facile per creare un singolo numero casuale compreso fra un minimo (incluso) e un massimo (escluso). La sintassi è semplice e prevede l’invocazione di un singolo metodo statico che ci ritornerà direttamente un int nell’intervallo richiesto.

import java.util.concurrent.ThreadLocalRandom;

 int numeroRandom = ThreadLocalRandom.current().nextInt(min, max + 1);

In questo caso abbiamo fornito al metodo nextInt i valori min, il minimo del nostro intervallo e max+1. Utilizziamo max+1 perché, come abbiamo detto prima, il limite superiore fornito è escluso dal range di generazione.

La classe java.util.Random

Se vogliamo generare più di un numero o vogliamo avere maggiore controllo sui nostri numeri generati possiamo utilizzare la classe java.util.Random. Questa classe ci permetterà di istanziare un oggetto di tipo Random, e da questo farci dare tutti i numeri casuali che vogliamo. La classe Random ci permette inoltre di specificare il seed da cui generare la sequenza. Il seed è un long a partire dal quale tutti i numeri della sequenza vengono generati in maniera deterministica. Utilizzando quindi lo stesso seed genereremo la stessa sequenza di numeri, questo potrebbe avere molti vantaggi in fase di unit testing, potremmo infatti generare sequenze di numeri sempre uguali senza doverci preoccupare di scrivere la sequenza a mano.

Il fatto di poter specificare il seed è un’arma a doppio taglio, se non facciamo infatti attenzione a generare il seed in maniera casuale, tutta la serie potrebbe essere compromessa. Pensiamo a casi in cui la casualità dei numeri generati è molto importante (giochi ad estrazione, crittografia, ecc…) e la conoscenza o la possibilità di restringere il campo sul possibile numero di seed utilizzati potrebbe portare a conseguenze disastrose.
Se non vogliamo specificare il seed e lasciare alla classe la scelta possiamo istanziare la classe senza specificare il seed, ne verrà scelto uno direttamente dalla classe ogni volta.

        int min = 4;
        int max = 10;
        Random random = new Random(54);
        int random1 = random.nextInt((max - min) + 1);
        System.out.println(random1 + min);
        int random2 = random.nextInt((max - min) + 1);
        System.out.println(random2 + min);
        int random3 = random.nextInt((max - min) + 1);
        System.out.println(random3 + min);

In questo esempio utilizziamo il metodo nextInt(int bound) che prende come argomento il limite massimo. per ottenere un numero fra min e max dovremmo quindi prima generare un numero fra 0 e max-min e poi successivamente aggiungere min per ottenere un numero nel giusto range.
Anche in questo caso bound non è compreso nell’intervallo e quindi dovremo fornire (max-min) + 1 alla funzione nextInt.
Eseguendo il codice sopra riportato, avendo specificato il seed 54, otterremo sempre i numeri 7, 4 e 8.

Utilizzo della funzione random java
Utilizzo della funzione random java

La classe java.security.SecureRandom

Se avete necessità di prestare particolare attenzione alla sicurezza nella generazione di numeri random potete utilizzare la classe java.security.SecureRandom. Essendo necessaria particolare attenzione in questi casi crediamo che questo argomento sia al di fuori dello scopo di questo articolo, vi rimandiamo quindi alla documentazione della classe per ulteriori informazioni.
java.security.SecureRandom


Se volete qualche esempio di applicazione della funzione random potete consultare alcune delle nostre pagine:
Generatore di numeri casuali da 1 a 90
Generatore di numeri casuali per superenalotto

Be First to Comment

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *