UNPKG

gnablib

Version:

A lean, zero dependency library to provide a useful base for your project.

2 lines 1.61 kB
/*! Copyright 2024-2025 the gnablib contributors MPL-1.1 */ import{asLE as t}from"../endian/platform.js";import{sLen as s}from"../safe/safe.js";import{APrng32 as e}from"./APrng32.js";export class Mt19937 extends e{constructor(){super(...arguments),this._ptr=0,this.bitGen=32,this.safeBits=32}trueSave(){const s=new Uint8Array(this._state.slice().buffer);t.i32(s,0,624);const e=new Uint8Array(2498);return e.set(s),e[2496]=this._ptr,e[2497]=this._ptr>>>8,e}twist(){const t=2567483615;let s,e=0;for(;e<227;e++)s=2147483648&this._state[e]|2147483647&this._state[e+1],this._state[e]=this._state[e+397]^s>>>1,1&s&&(this._state[e]^=t);for(;e<623;e++)s=2147483648&this._state[e]|2147483647&this._state[e+1],this._state[e]=this._state[e-227]^s>>>1,1&s&&(this._state[e]^=t);s=2147483648&this._state[e]|2147483647&this._state[0],this._state[e]=this._state[396]^s>>>1,1&s&&(this._state[e]^=t),this._ptr=0}init(){for(let t=1;t<this._state.length;t++){const s=this._state[t-1]^this._state[t-1]>>>30;this._state[t]=Math.imul(1812433253,s)+t}this.twist()}rawNext(){this._ptr>=624&&this.twist();let t=this._state[this._ptr++];return t^=t>>>11,t^=t<<7&2636928640,t^=t<<15&4022730752,t^=t>>>18,t>>>0}get[Symbol.toStringTag](){return"mt19937"}static new(t=!1){const s=new Mt19937(new Uint32Array(624),t);return s._state[0]=19650218,s.init(),s}static seed(t,s=!1){const e=new Mt19937(new Uint32Array(624),s);return e._state[0]=t,e.init(),e}static restore(e,i=!1){s("state",e).exactly(2498).throwNot();const r=e.slice();t.i32(r,0,624);const a=new Uint32Array(r.buffer,0,624),n=new Mt19937(a,i);return n._ptr=r[2496]|r[2497]<<8,n}}