
Tool zur Replikation des Java-Random-Zustands, das zukünftige Zufallswerte vorhersagt, indem es den internen Zustand aus beobachteten Ausgaben wiederherstellt und die Schwächen LCG-basierter PRNGs aufzeigt.
Siehe README im Ordner node
Gegeben einen double, der von nextDouble einer java.util.Random erzeugt wurde, erstelle ein Random mit demselben Zustand neu. Dieses ReplicatedRandom kann dann verwendet werden, um die zukünftigen Werte des ursprünglichen Random vorherzusagen.
Beispiel:
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
Funktioniert auch mit Math.random(), da es intern Random verwendet:
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
Funktioniert auch für nextInt(), erfordert jedoch zwei aufeinanderfolgende Werte:
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
Siehe diesen Blogbeitrag für Details.