
Strumento di replica dello stato di Java Random che predice valori casuali futuri recuperando lo stato interno da output osservati, dimostrando le debolezze dei PRNG basati su LCG.
Vedi il README nella cartella node
Data una variabile di tipo double generata da nextDouble di un java.util.Random, ricrea un Random con lo stesso stato. Questo ReplicatedRandom può quindi essere utilizzato per prevedere i valori futuri del Random originale.
Esempio:
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
Funziona anche con Math.random() poiché internamente usa Random:
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
Funziona anche con nextInt() ma richiede due valori consecutivi:
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
Vedi questo post del blog per i dettagli.