Seeded Pseudo-Random Generator for Tests
Produce reproducible pseudo-random numbers with Mulberry32, plus integer range and array pick helpers for deterministic fixtures.
Code
export interface SeededRandom {
next(): number;
int(min: number, max: number): number;
pick<T>(items: readonly T[]): T;
}
export function createSeededRandom(seed: number): SeededRandom {
if (!Number.isInteger(seed)) throw new TypeError("seed must be an integer");
let state = seed >>> 0;
const next = (): number => {
state = (state + 0x6d2b79f5) >>> 0;
let value = state;
value = Math.imul(value ^ (value >>> 15), value | 1);
value ^= value + Math.imul(value ^ (value >>> 7), value | 61);
return ((value ^ (value >>> 14)) >>> 0) / 4294967296;
};
return {
next,
int(min: number, max: number): number {
if (!Number.isInteger(min) || !Number.isInteger(max) || max < min) {
throw new RangeError("min and max must define an integer range");
}
return min + Math.floor(next() * (max - min + 1));
},
pick<T>(items: readonly T[]): T {
if (!Array.isArray(items) || items.length === 0) {
throw new RangeError("items must be a non-empty array");
}
return items[Math.floor(next() * items.length)] as T;
},
};
}Report a problem with this exampleOpens a pre-filled issue on GitHub.