// Seeded pseudo-random number generator (mulberry32) export function createRng(seed: number) { let s = seed >>> 0; return () => { s += 0x6d2b79f5; let t = Math.imul(s ^ (s >>> 15), 1 | s); t ^= t + Math.imul(t ^ (t >>> 7), 61 | t); return ((t ^ (t >>> 14)) >>> 0) / 4294967296; }; } export function dateToSeed(date: string): number { // date = "YYYY-MM-DD" return date.split("-").reduce((acc, n) => acc * 1000 + parseInt(n), 0); } export function todayISO(): string { return new Date().toISOString().slice(0, 10); } export function shuffle(arr: T[], rng: () => number): T[] { const a = [...arr]; for (let i = a.length - 1; i > 0; i--) { const j = Math.floor(rng() * (i + 1)); [a[i], a[j]] = [a[j], a[i]]; } return a; }