
Ferramenta de replicação de estado aleatório Java que prevê valores aleatórios futuros recuperando o estado interno de saídas observadas, demonstrando fraquezas em PRNGs baseados em LCG.
Consulte o README na pasta node
Dado um double gerado a partir de nextDouble de um java.util.Random, recrie um Random com o mesmo estado. Este ReplicatedRandom pode então ser usado para prever os valores futuros do Random original.
Exemplo:
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
Também funciona com Math.random() pois usa Random internamente:
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
Também funciona para nextInt(), mas requer dois valores consecutivos:
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
Consulte este blog post para detalhes.