predict-next-random
Version:
Predicts the next number in a sequence of Math.random() numbers
3 lines (2 loc) • 1.55 kB
JavaScript
var S=Object.create;var u=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var V=Object.getOwnPropertyNames;var b=Object.getPrototypeOf,y=Object.prototype.hasOwnProperty;var M=(t,a)=>{for(var e in a)u(t,e,{get:a[e],enumerable:!0})},x=(t,a,e,s)=>{if(a&&typeof a=="object"||typeof a=="function")for(let r of V(a))!y.call(t,r)&&r!==e&&u(t,r,{get:()=>a[r],enumerable:!(s=g(a,r))||s.enumerable});return t};var F=(t,a,e)=>(e=t!=null?S(b(t)):{},x(a||!t||!t.__esModule?u(e,"default",{value:t,enumerable:!0}):e,t)),N=t=>x(u({},"__esModule",{value:!0}),t);var p={};M(p,{default:()=>h});module.exports=N(p);var B=F(require("z3-solver"),1);async function h(t=[Math.random(),Math.random(),Math.random(),Math.random(),Math.random()]){t=t.reverse();let{Context:a}=await B.default.init(),e=a("main"),s=e.BitVec.const("seState0",64),r=e.BitVec.const("seState1",64),d=new e.Solver;for(let o=0;o<t.length;o++){let n=s,l=r,i=l;n=n.xor(n.shl(e.BitVec.val(23n,64))),n=n.xor(n.lshr(e.BitVec.val(17n,64))),n=n.xor(l),n=n.xor(l.lshr(e.BitVec.val(26n,64)));let f=n,c=new ArrayBuffer(8),w=new DataView(c);w.setFloat64(0,t[o]+1,!0);let m=w.getBigUint64(0,!0)&(1n<<52n)-1n;d.add(e.Eq(e.Int2BV(Number(m),64),i.lshr(e.BitVec.val(12n,64)))),s=i,r=f}if(await d.check()==="sat"){let o=await d.model(),n={};for(let m of o.decls()){let v=o.get(m);n[m.name()]=o.eval(v)}let i=BigInt(n.seState0.asString())>>12n|0x3FF0000000000000n,f=new ArrayBuffer(8),c=new DataView(f);return c.setBigUint64(0,i,!0),c.getFloat64(0,!0)-1}return null}
module.exports = module.exports.default;