
Инструмент репликации состояния Java Random, который предсказывает будущие случайные значения, восстанавливая внутреннее состояние по наблюдаемым выходным данным и демонстрируя слабости ГПСЧ на основе LCG.
См. README в папке node
Имея double, сгенерированный через nextDouble из java.util.Random, воссоздайте Random с тем же состоянием. Этот ReplicatedRandom затем можно использовать для предсказания будущих значений исходного Random.
Пример:
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
Также работает с Math.random(), поскольку внутри он использует 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
Также работает для nextInt(), но требует двух последовательных значений:
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
Подробности см. в этом сообщении в блоге.