const N = 624; const M = 397; const MATRIX_A = 0x9908b0df; const UPPER_MASK = 0x80000000; const LOWER_MASK = 0x7fffffff; const mag01 = [ 0x0, MATRIX_A ]; const INIT_MUL = 1812433253; /// The given function generates random numbers on the [ 0, 0xffffffff ]-interval. export const makeRandom = (seed = (new Date()).getTime()) => { const mt = new Array(N); let mti = null; mt[0] = seed >>> 0; for (mti = 1; mti < N; mti++) { const s0 = mt[mti - 1] ^ (mt[mti - 1] >>> 30); mt[mti] = (((((s0 & 0xffff0000) >>> 16) * INIT_MUL) << 16) + (( s0 & 0x0000ffff) * INIT_MUL) + mti) >>> 0; } return () => { if (mti >= N) { let kk = null; for (kk = 0; kk < N - M; kk++) { const y0 = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK); mt[kk] = mt[kk + M] ^ (y0 >>> 1) ^ mag01[y0 & 0x1]; } for (; kk < N - 1; kk++) { const y1 = (mt[kk] & UPPER_MASK) | (mt[kk + 1] & LOWER_MASK); mt[kk] = mt[kk + (M - N)] ^ (y1 >>> 1) ^ mag01[y1 & 0x1]; } const y2 = (mt[N - 1] & UPPER_MASK) | (mt[0] & LOWER_MASK); mt[N - 1] = mt[M - 1] ^ (y2 >>> 1) ^ mag01[y2 & 0x1]; mti = 0; } let y = mt[mti++]; y ^= (y >>> 11); y ^= (y << 7) & 0x9d2c5680; y ^= (y << 15) & 0xefc60000; y ^= (y >>> 18); return y >>> 0; }; };