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)),
rot = s3 >> 11,
out_int32 = (xorshifted >>> rot) | (xorshifted << ((-rot) & 31));
return eps * (out_int32 >>> 0);
}
}