fix: rng impl

This commit is contained in:
hyper 2026-04-01 17:37:24 +08:00
parent df9698b67b
commit 8d778f9867
2 changed files with 4 additions and 34 deletions

View File

@ -1,6 +1,8 @@
export interface RNG {
/** 设置随机数种子 */
(seed: number): void;
setSeed(seed: number): void;
getSeed(): number;
/** 获取一个 [0,1) 随机数 */
next(max?: number): number;
@ -14,33 +16,7 @@
* 32 PRNG
*/
export function createRNG(seed?: number): RNG {
let currentSeed: number = seed ?? 1;
function rng(seed: number): void {
currentSeed = seed;
}
rng.next = function(max?: number): number {
let t = (currentSeed += 0x6d2b79f5);
t = Math.imul(t ^ (t >>> 15), t | 1);
t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
const result = ((t ^ (t >>> 14)) >>> 0) / 4294967296;
return max !== undefined ? result * max : result;
};
rng.nextInt = function(max: number): number {
return Math.floor(rng.next(max));
};
(rng as any).setSeed = function(seed: number): void {
currentSeed = seed;
};
(rng as any).getSeed = function(): number {
return currentSeed;
};
return rng;
return new Mulberry32RNG(seed);
}
/** Mulberry32RNG 类实现(用于类型兼容) */

View File

@ -70,12 +70,6 @@ describe('createRNG', () => {
expect(firstSequence).toEqual(secondSequence);
});
it('should work as callable function', () => {
const rng = createRNG(42);
rng(123);
expect(rng.getSeed()).toBe(123);
});
it('should generate uniformly distributed integers', () => {
const rng = createRNG(42);
const buckets = new Array(10).fill(0);