
أداة إعادة تمثيل حالة 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
انظر منشور المدونة للحصول على التفاصيل.