import { SeedableRandomEngine } from "./RandomEngine"; export class LCGState { public modulus:number; public multiplier:number; public increment:number; public state:number; } export class LCG extends SeedableRandomEngine { private _seedState:LCGState = new LCGState(); private _normalizer:number; constructor() { super(); this.setParameters( Math.pow( 2, 32 ), 1664525, 1013904223 ); } setParameters( modulus:number, multiplier:number, increment:number ):void { this._seedState.modulus = modulus; this._seedState.multiplier = multiplier; this._seedState.increment = increment; this._seedState.state = 0; this._normalizer = 1 / ( this._seedState.modulus ); } getSeedState() { var seedState = new LCGState(); seedState.modulus = this._seedState.modulus; seedState.multiplier = this._seedState.multiplier; seedState.increment = this._seedState.increment; seedState.state = this._seedState.state; return seedState; } setSeedState( seedState:LCGState ) { this._seedState.modulus = seedState.modulus; this._seedState.multiplier = seedState.multiplier; this._seedState.increment = seedState.increment; this._seedState.state = seedState.state; this._normalizer = 1 / ( this._seedState.modulus ); } next() { this._seedState.state = ( this._seedState.state * this._seedState.multiplier + this._seedState.increment) % this._seedState.modulus; var value = this._seedState.state * this._normalizer; return Math.abs( value ); } setSeed( seed:number ) { this._seedState.state = seed % this._seedState.modulus; } warmUp( runs:number = 1000 ) { for ( let i = 0; i < runs; i++) { this.next(); } } }