随机与可复现随机
讲解 Math.random()
的局限,并给出“可复现”的伪随机生成器(PRNG),适用于重放或回放。
基础随机回顾
js
// [min, max] 随机整数
function randInt(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
1
2
3
4
2
3
4
线性同余生成器(LCG)示例
js
function createLCG(seed = 123456789) {
let state = seed >>> 0;
const a = 1664525;
const c = 1013904223;
const m = 2 ** 32;
return () => {
state = (a * state + c) % m;
return state / m; // [0,1)
};
}
const rnd = createLCG(42);
rnd(); // 可复现
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
基于 LCG 的区间随机
js
function randIntSeeded(random, min, max) {
return Math.floor(random() * (max - min + 1)) + min;
}
1
2
3
2
3