pcgrandom_job = {
const
eps = Math.pow(2, -32),
lo = 0xFFFF,
m0 = 0x7F2D, m1 = 0x4C95, m2 = 0xF42D, m3 = 0x5851,
a0 = 0x814F, a1 = 0xF767, a2 = 0x7B7E, a3 = 0x1405,
state = Uint16Array.from({length: 4}, () => Math.random() * 0x10000);
return function pcgrandom(){
const
s0 = state[0], s1 = state[1], s2 = state[2], s3 = state[3],
new0 = a0 + (s0*m0 & lo),
new1 = a1 + (new0 >>> 16) +
((s0*m1 & lo) + (s0*m0 >>> 16)) +
(s1*m0 & lo),
new2 = a2 + (new1 >>> 16) +
((s0*m2 & lo) + (s0*m1 >>> 16)) +
((s1*m1 & lo) + (s1*m0 >>> 16)) +
(s2*m0 & lo),
new3 = a3 + (new2 >>> 16) +
((s0*m3 & lo) + (s0*m2 >>> 16)) +
((s1*m2 & lo) + (s1*m1 >>> 16)) +
((s2*m1 & lo) + (s2*m0 >>> 16)) +
(s3*m0 & lo);
state[0] = new0; state[1] = new1; state[2] = new2; state[3] = new3;
const
xorshifted = (s3 << 21) + ((s3 >> 2 ^ s2) << 5) + ((s2 >> 2 ^ s1) >> 11),
out_int32 = xorshifted >>> (s3 >> 11) | xorshifted << (-(s3 >> 11) & 31);
return eps * (out_int32 >>> 0);
}
}