29 lines
860 B
TypeScript
29 lines
860 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 {
|
|
const d = new Date();
|
|
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, "0")}-${String(d.getDate()).padStart(2, "0")}`;
|
|
}
|
|
|
|
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;
|
|
}
|