aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/client/utils/random.ts
blob: 53de45e6e491a2eb9596cdd621bfa93b1486d44f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
 * Mulberry32 seeded PRNG.
 * Returns a function that produces deterministic values in [0, 1).
 */
export function createSeededRandom(seed: number): () => number {
	let s = seed | 0;
	return () => {
		s = (s + 0x6d2b79f5) | 0;
		let t = Math.imul(s ^ (s >>> 15), 1 | s);
		t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
		return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
	};
}

/**
 * Fisher-Yates shuffle algorithm.
 * Returns a new shuffled array (does not mutate the original).
 * Accepts an optional `random` function for deterministic shuffling.
 */
export function shuffle<T>(
	array: T[],
	random: () => number = Math.random,
): T[] {
	const result = [...array];
	for (let i = result.length - 1; i > 0; i--) {
		const j = Math.floor(random() * (i + 1));
		const temp = result[i] as T;
		result[i] = result[j] as T;
		result[j] = temp;
	}
	return result;
}