UNPKG

gnablib

Version:

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

2 lines 1.47 kB
/*! Copyright 2025 the gnablib contributors MPL-1.1 */ import{asLE as t}from"../endian/platform.js";import{U64 as s,U64MutArray as a}from"../primitive/number/U64.js";import{sLen as e}from"../safe/safe.js";import{APrng64 as r}from"./APrng64.js";export class Gjrand64 extends r{constructor(){super(...arguments),this.bitGen=64,this.safeBits=64}rawNext(){return this._state.at(1).addEq(this._state.at(2)),this._state.at(0).lRotEq(32),this._state.at(2).xorEq(this._state.at(1)),this._state.at(3).addEq(s.fromInt(1437243045)),this._state.at(0).addEq(this._state.at(1)),this._state.at(2).lRotEq(23),this._state.at(1).xorEq(this._state.at(0)),this._state.at(0).addEq(this._state.at(2)),this._state.at(1).lRotEq(19),this._state.at(2).addEq(this._state.at(0)),this._state.at(1).addEq(this._state.at(3)),this._state.at(0).mut()}get[Symbol.toStringTag](){return"gjrand64"}static new(t=!1){const s=Uint32Array.of(2361955991,2308445249,4286249029,4038403806,403824257,4256023257,2941533446,4),e=a.mount(s);return new Gjrand64(e,t)}static seed(t,e,r=!1){const i=a.fromLen(8);"number"==typeof t?(i.at(0).set(s.fromInt(t)),i.at(2).set(s.fromI32s(1000001,0))):e?(i.at(0).set(e),i.at(1).set(t),i.at(2).set(s.fromI32s(5000001,0))):(i.at(0).set(t),i.at(2).set(s.fromI32s(2000001,0)));const o=new Gjrand64(i,r);for(let t=0;t<14;t++)o.rawNext();return o}static restore(s,r=!1){e("state",s).exactly(32).throwNot();const i=s.slice();return t.i32(i,0,8),new Gjrand64(a.fromBytes(i.buffer),r)}}