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;
}
|