
Outil de réplication d'état Java Random qui prédit les futures valeurs aléatoires en récupérant l'état interne à partir des sorties observées, démontrant les faiblesses des PRNG basés sur LCG.
Voir le README dans le dossier node
Étant donné un double généré par nextDouble d'un java.util.Random, recréez un Random avec le même état. Ce ReplicatedRandom peut ensuite être utilisé pour prédire les valeurs futures du Random d'origine.
Exemple :
Random r = new Random();
ReplicatedRandom rr = new ReplicatedRandom();
rr.replicateState(r.nextDouble());
System.out.println(r.nextDouble() == rr.nextDouble()); // True
System.out.println(r.nextDouble() == rr.nextDouble()); // True
System.out.println(r.nextDouble() == rr.nextDouble()); // True
Fonctionne également avec Math.random() car il utilise Random en interne :
ReplicatedRandom rr = new ReplicatedRandom();
rr.replicateState(Math.random());
System.out.println(Math.random() == rr.nextDouble()); // True
System.out.println(Math.random() == rr.nextDouble()); // True
System.out.println(Math.random() == rr.nextDouble()); // True
Fonctionne également pour nextInt() mais nécessite deux valeurs consécutives :
Random r = new Random();
ReplicatedRandom rr = new ReplicatedRandom();
rr.replicateState(r.nextInt(), r.nextInt());
System.out.println(r.nextInt() == rr.nextInt()); // True
System.out.println(r.nextInt() == rr.nextInt()); // True
System.out.println(r.nextInt() == rr.nextInt()); // True
Voir ce billet de blog pour plus de détails.