predict-next-random
Version:
Predicts the next number in a sequence of Math.random() numbers
2 lines (1 loc) • 907 B
JavaScript
import x from"z3-solver";async function B(a=[Math.random(),Math.random(),Math.random(),Math.random(),Math.random()]){a=a.reverse();let{Context:f}=await x.init(),e=f("main"),u=e.BitVec.const("seState0",64),d=e.BitVec.const("seState1",64),i=new e.Solver;for(let n=0;n<a.length;n++){let t=u,r=d,o=r;t=t.xor(t.shl(e.BitVec.val(23n,64))),t=t.xor(t.lshr(e.BitVec.val(17n,64))),t=t.xor(r),t=t.xor(r.lshr(e.BitVec.val(26n,64)));let c=t,s=new ArrayBuffer(8),m=new DataView(s);m.setFloat64(0,a[n]+1,!0);let l=m.getBigUint64(0,!0)&(1n<<52n)-1n;i.add(e.Eq(e.Int2BV(Number(l),64),o.lshr(e.BitVec.val(12n,64)))),u=o,d=c}if(await i.check()==="sat"){let n=await i.model(),t={};for(let l of n.decls()){let w=n.get(l);t[l.name()]=n.eval(w)}let o=BigInt(t.seState0.asString())>>12n|0x3FF0000000000000n,c=new ArrayBuffer(8),s=new DataView(c);return s.setBigUint64(0,o,!0),s.getFloat64(0,!0)-1}return null}export{B as default};