73 lines
1.8 KiB
TypeScript
73 lines
1.8 KiB
TypeScript
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();
|
|
}
|
|
}
|
|
|
|
} |