La classe Random en Java

Introduction à la classe Random

La classe Random est incluse dans le package java.util. Elle est essentielle pour générer des valeurs aléatoires ou des flux de valeurs aléatoires de types de données spécifiques.

Utilisation de la classe Random

Pour accéder à la classe Random, il suffit de l'importer via l'instruction suivante :

import java.util.Random;

Lorsque vous créez une instance de la classe Random, vous pouvez soit ne pas fournir de valeur (générant ainsi un nombre aléatoire basé sur l'horloge du système), soit passer une valeur de seed (graine).

La seed est une valeur qui aide à générer un flux de nombres aléatoires à partir d'une formule linéaire congruentielle, et la classe Random utilise une graine sur 48 bits.

Dans l'exemple suivant, deux objets de type Random, rand1 et rand2, sont créés. rand1 ne reçoit aucune seed tandis que rand2 en reçoit une.

Random rand1 = new Random();
long seed = (long) 3.142;
Random rand2 = new Random(seed);

Modification de la seed

La valeur de la seed peut être changée à tout moment dans le programme grâce à la méthode .setSeed(). Voici comment cela fonctionne :

long newSeed = (long) 2.7182;
rand2.setSeed(newSeed);

Notez que si deux objets Random sont créés avec la même seed, ils produiront la même séquence de nombres si les appels de méthodes sont identiques.

Génération de valeurs individuelles

Les méthodes .nextDouble() et .nextFloat() renvoient des valeurs dans l'intervalle [0,1). Cela signifie que 0 est inclus (indiqué par le crochet) tandis que 1 est exclu (indiqué par la parenthèse).

D'autre part, .nextInt() et .nextLong() ne comportent pas de telles limites. Vous pouvez ainsi générer des valeurs aléatoires comme suit :

float f = rand1.nextFloat();
double d = rand1.nextDouble();
int i = rand1.nextInt();
long l = rand1.nextLong();
boolean b = rand1.nextBoolean();
System.out.println("Valeur float aléatoire: " + f);
System.out.println("Valeur double aléatoire: " + d);
System.out.println("Entier aléatoire: " + i);
System.out.println("Long aléatoire: " + l);
System.out.println("Boolean aléatoire: " + b);

Un exemple de sortie serait :

Valeur float aléatoire: 0.13293427
Valeur double aléatoire: 0.900476085026994
Entier aléatoire: 152429987
Long aléatoire: -4775630185711902523
Boolean aléatoire: true

Il est également possible de limiter la plage de .nextInt() avec une borne supérieure :

i = rand1.nextInt(25);
System.out.println("Entier aléatoire dans l'intervalle [0,25): " + i);

Cela peut produire une sortie telle que :

Entier aléatoire dans l'intervalle [0,25): 16

Génération de flux de données

Des objets de types IntStream, DoubleStream, et LongStream peuvent être créés à l'aide des méthodes .ints(), .doubles(), et .longs(). Voici comment créer un DoubleStream :

Pour utiliser l'objet de ce type, un import spécifique est nécessaire :

import java.util.stream.DoubleStream;

Pour générer un flux illimité de valeurs aléatoires de type double dans l'intervalle [0,1) :

DoubleStream stream = rand1.doubles();

Pour un flux de double dans une plage donnée, vous pouvez utiliser :

stream = rand1.doubles(0, 10);

Notez que dans ce cas, la borne inférieure est incluse alors que la borne supérieure l'est exclus.

Applications pratiques de la classe Random

La classe Random est particulièrement utile dans de nombreuses applications, telles que les jeux, les simulations ou même pour la génération de clés de sécurité en cryptographie. En créant un générateur de nombres aléatoires, vous pouvez rendre votre application plus dynamique et imprévisible, ce qui est souvent souhaitable dans ces cas.