Pourquoi l’utilisation de Random avec une graine codée en dur produit-elle toujours les mêmes résultats?

Le programme simple suivant en Java utilise la classe java.util.Random de telle sorte qu’il affiche toujours “hello world”. L’extrait de code peut être vu ci-dessous.

 package nomain; import java.util.Random; final public class J { public static Ssortingng randomSsortingng(int seed) { Random rand = new Random(seed); SsortingngBuilder sb = new SsortingngBuilder(); for(int i=0;;i++) { int n=rand.nextInt(27); if (n==0) { break; } sb.append((char) ('`'+n)); } return sb.toSsortingng(); } public static void main(Ssortingng args[]) { System.out.println(randomSsortingng(-229985452)+' '+randomSsortingng(-147909649)); } } 

Il y a une certaine surprise en ce sens qu’il affiche toujours “hello world” même si la classe Random est utilisée pour générer les nombres aléatoires. Les numéros doivent être modifiés à chaque exécution et les caractères correspondants doivent être modifiés en conséquence une chaîne stable qui est comme mentionné ci-dessus “hello world”. Pourquoi ça se passe?

La réponse est le paramètre transmis. Il est utilisé pour créer le générateur de nombres aléatoires.

 Random rand = new Random(seed); 

Les PRNG ne sont pas vraiment aléatoires – ils sont déterministes, mais sont conçus pour simuler le caractère aléatoire. Pour cette raison, il est préférable de les nommer “générateurs de nombres pseudo-aléatoires”.

Pour une graine donnée, un PRNG générera toujours le même nombre. Il utilise alors vraisemblablement son dernier résultat en tant qu’entrée de la valeur suivante. En amorçant le PRNG avec une valeur connue, vous produirez toujours une séquence connue de nombres “aléatoires”.

Les nombres -229985452 et -147909649 sont connus pour être des germes, ce qui entraînera la production par le PRNG d’une séquence de 5 chiffres pouvant être interprétés comme “bonjour” et “monde”. Si vous deviez changer ces nombres, vous obtiendriez des séquences de 5 caractères différentes, mais elles seraient les mêmes pour chaque exécution du programme, tant que la graine rest la même.