61 lines
1.4 KiB
TypeScript
61 lines
1.4 KiB
TypeScript
export interface RNG {
|
|
/** 设置随机数种子 */
|
|
setSeed(seed: number): void;
|
|
|
|
getSeed(): number;
|
|
|
|
/** 获取一个 [0,1) 随机数 */
|
|
next(max?: number): number;
|
|
|
|
/** 获取一个 [0,max) 随机整数 */
|
|
nextInt(max: number): number;
|
|
}
|
|
|
|
/**
|
|
* 使用 mulberry32 算法实现的伪随机数生成器
|
|
* 这是一个快速、高质量的 32 位 PRNG
|
|
*/
|
|
export function createRNG(seed?: number): RNG {
|
|
return new Mulberry32RNG(seed);
|
|
}
|
|
|
|
/** Mulberry32RNG 类实现(用于类型兼容) */
|
|
export class Mulberry32RNG {
|
|
private seed: number = 1;
|
|
|
|
constructor(seed?: number) {
|
|
if (seed !== undefined) {
|
|
this.seed = seed;
|
|
}
|
|
}
|
|
|
|
/** 设置随机数种子 */
|
|
call(seed: number): void {
|
|
this.seed = seed;
|
|
}
|
|
|
|
/** 获取一个 [0,1) 随机数 */
|
|
next(max?: number): number {
|
|
let t = (this.seed += 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;
|
|
}
|
|
|
|
/** 获取一个 [0,max) 随机整数 */
|
|
nextInt(max: number): number {
|
|
return Math.floor(this.next(max));
|
|
}
|
|
|
|
/** 重新设置种子 */
|
|
setSeed(seed: number): void {
|
|
this.seed = seed;
|
|
}
|
|
|
|
/** 获取当前种子 */
|
|
getSeed(): number {
|
|
return this.seed;
|
|
}
|
|
}
|