puzzle-trainer/rng.ts
2026-05-23 01:05:21 +00:00

28 lines
770 B
TypeScript

// 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<T>(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;
}