export type Rng = {
  nextFloat(): number; // [0, 1)
  nextInt(maxExclusive: number): number; // [0, maxExclusive)
};

function toUint32(seed: number): number {
  return (seed >>> 0) || 0x12345678;
}

// Small, fast, deterministic PRNG suitable for demos (not crypto).
// Source: public-domain "mulberry32" style generator.
export function createRng(seed: number): Rng {
  let state = toUint32(seed);

  const nextUint32 = () => {
    state = (state + 0x6d2b79f5) >>> 0;
    let t = state;
    t = Math.imul(t ^ (t >>> 15), t | 1);
    t ^= t + Math.imul(t ^ (t >>> 7), t | 61);
    return (t ^ (t >>> 14)) >>> 0;
  };

  return {
    nextFloat() {
      return nextUint32() / 2 ** 32;
    },
    nextInt(maxExclusive: number) {
      if (!Number.isFinite(maxExclusive) || maxExclusive <= 0) return 0;
      return Math.floor(this.nextFloat() * maxExclusive);
    },
  };
}

