UNPKG

gan-i3-356-bluetooth

Version:

Library for connecting to and interacting with Bluetooth-enabled Rubik's cubes (GAN)

1 lines 1.81 kB
export class ModernRandom{constructor(initialSeed){this._seedData=null,this._seedIndex=0,this._seedBuffer=new Uint32Array(256),this.seed(initialSeed??String(Math.random())),this.reset=this.reset.bind(this),this.seed=this.seed.bind(this),this.rand=this.rand.bind(this),this.random=this.random.bind(this),this.prng=this.prng.bind(this),this.internals=this.internals.bind(this)}generateRandomValues(){if("undefined"!=typeof window&&window.crypto&&window.crypto.getRandomValues)window.crypto.getRandomValues(this._seedBuffer);else for(let i=0;i<this._seedBuffer.length;i++)this._seedBuffer[i]=Math.floor(4294967296*Math.random());this._seedIndex=0}reset(){this._seedData=null,this._seedIndex=0,this._seedBuffer=new Uint32Array(256),this.generateRandomValues()}seed(s){if(this.reset(),null!==s){if("number"==typeof s&&(s=[s]),Array.isArray(s)){const seedArray=new Uint32Array(s.length);for(let i=0;i<s.length;i++)seedArray[i]="number"==typeof s[i]?s[i]:0;for(let i=0;i<this._seedBuffer.length;i++)this._seedBuffer[i]^=seedArray[i%seedArray.length]}else if("string"==typeof s){const charCodes=[];for(let i=0;i<s.length;i++)charCodes.push(s.charCodeAt(i));this.seed(charCodes)}this._seedData=s,this.generateRandomValues()}else this.generateRandomValues()}rand(){return this._seedIndex>=this._seedBuffer.length&&this.generateRandomValues(),this._seedBuffer[this._seedIndex++]}random(){return this.rand()/4294967296}prng(n){(void 0!==n&&"number"==typeof n?Math.abs(Math.floor(n)):1)>0&&this.generateRandomValues()}internals(obj){const ret={buffer:this._seedBuffer.slice(),index:this._seedIndex,seed:this._seedData};return obj&&(obj.buffer&&(this._seedBuffer=obj.buffer.slice()),void 0!==obj.index&&(this._seedIndex=obj.index),void 0!==obj.seed&&(this._seedData=obj.seed)),ret}}export const modernRandom=new ModernRandom;