gnablib
Version:
A lean, zero dependency library to provide a useful base for your project.
2 lines • 1.21 kB
JavaScript
/*! Copyright 2025 the gnablib contributors MPL-1.1 */
import{asLE as t}from"../endian/platform.js";import{U64 as s,U64Mut as r}from"../primitive/number/U64.js";import{sLen as e}from"../safe/safe.js";import{APrng32 as o}from"./APrng32.js";const n=s.fromI32s(1,0),i=s.fromI32s(1284865837,1481765933);export class Pcg32 extends o{constructor(t,s,r){super(t,r),this.bitGen=32,this.safeBits=32,this._inc=s}trueSave(){const t=new Uint8Array(16);return t.set(this._state.toBytesLE()),t.set(this._inc.toBytesLE(),8),t}rawNext(){const t=this._state.mut(),s=this._state.high>>>27,r=t.xorEq(t.rShift(18)).rShiftEq(27).low;return this._state.mulEq(i).addEq(this._inc),(r>>>s|r<<32-s)>>>0}get[Symbol.toStringTag](){return"pcg32"}static new(t=!1){const e=s.fromI32s(2495175643,3661511115),o=r.fromI32s(1955588763,2235320806);return new Pcg32(o,e,t)}static seed(t,e,o=!1){const m=null!=e?e.mut().lShiftEq(1).xorEq(n):s.fromI32s(2495175643,3661511115),a=r.fromI32s(0,0);return a.mulEq(i).addEq(m),a.addEq(t),a.mulEq(i).addEq(m),new Pcg32(a,m,o)}static restore(o,n=!1){e("state",o).exactly(16).throwNot();const i=o.slice();t.i32(i,0,4);const m=new Uint32Array(i.buffer),a=r.mount(m,0),c=s.mount(m,2);return new Pcg32(a,c,n)}}