28 lines
770 B
TypeScript
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;
|
|
}
|