消消乐系列--伪随机数生成器

it2025-11-17  9

梅森旋转算法(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; } }

在使用过程中有什么问题,或者有什么BUG亦或有什么新的需求都可以留言。能解决的会抽时间进行解决。

谢谢大家的支持

长按下图二维码关注,你将感受到一个渴望成长的灵魂,且每篇文章都有惊喜。

 

最新回复(0)