Seeded Pseudo-Random Generator for Tests

Produce reproducible pseudo-random numbers with Mulberry32, plus integer range and array pick helpers for deterministic fixtures.

TypescriptData Integrity

Code

snippet
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;
    },
  };
}