梅森旋转算法(Mersenne twister)是一个伪随机数发生算法。由松本真和西村拓士在1997年开发,基于有限二进制字段上的矩阵线性递归。可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷。
在游戏里开发中录像回放,bug追踪 都需要一致的随机数种子,默认玩家操作。在消除游戏中需要恢复盘面,追踪bug,录像回放。都需要用到一致的随机数。
根据java版本代码,重新书写一边ts版本。
/** * 梅森旋转算法(Mersenne twister)是一个伪随机数发生算法。 * 由松本真和西村拓士在1997年开发,基于有限二进制字段上的矩阵线性递归。 * 可以快速产生高质量的伪随机数,修正了古典随机数发生算法的很多缺陷。 */ export class EMRandom { private readonly N: number = 624; private readonly M: number = 397; private readonly MATRIX_A: number = 0x9908b0df; private readonly UPPER_MASK: number = 0x80000000; private readonly LOWER_MASK: number = 0x7fffffff; private readonly TEMPERING_MASK_B: number = 0x9d2c5680; private readonly TEMPERING_MASK_C: number = 0xefc60000; private mt: number[] = []; private mti: number; private _seed: number = 0; public constructor(seed: number = 0) { this.mti = this.N + 1; if (seed == 0) { let data = new Date(); seed = data.getTime() / 1000;//因为毫秒超出了最大值 } this.setSeed(seed); } private setSeed(val: number) { this._seed = val; this.randomSeed(val); } private randomSeed(seed: number) { this.mti = 0; this.mt[0] = seed & 0xffffffff; for (this.mti = 1; this.mti < this.N; this.mti++) { this.mt[this.mti] = this._multi(1812433253, (this.mt[(this.mti - 1)] ^ (this.mt[(this.mti - 1)] >> 30))) + this.mti; this.mt[this.mti] &= 0xffffffff; } } private _multi(a: number, b: number): number { let a_low = a & 0xffff; let a_high = a >> 16; let b_low = b & 0xffff; let b_high = b >> 16; return (((((a_low * b_low >> 16) + a_low * b_high) & 0xffff) + a_high * b_low) & 0xffff) << 16 | a_low * b_low & 0xffff; } public randomInt32(): number { //关注微信获取更多代码 return y; } }
请赞赏
朋友,创作不易;为犒赏小编的辛勤劳动,请她喝杯咖啡吧!
给她赞赏,您将财运亨通