library-ts/browser/random/LCG.ts

73 lines
1.8 KiB
TypeScript
Raw Permalink Normal View History

2025-03-08 08:16:54 +00:00
import { SeedableRandomEngine } from "./RandomEngine";
export class LCGState
{
public modulus:number;
public multiplier:number;
public increment:number;
public state:number;
}
export class LCG extends SeedableRandomEngine<LCGState>
{
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();
}
}
}