种子随机:线性同余生成器(LCG, Linear Congruential Generator)
线性同余生成器
实现代码:
1 | Math.seed = 5; |
本文的重点是:(Math.seed * 9301 + 49297) % 233280,为什么会是这三个值,而不是其它的到底这三个数字有什么神秘的来历呢?
像 Math.seededRandom 这种伪随机数生成器叫做线性同余生成器(LCG, Linear Congruential Generator),几乎所有的运行库提供的 rand 都是采用的LCG,形如:
In+1=aIn+c(mod m)
生成的伪随机数序列最大周期m,范围在 0 到 m-1 之间。要达到这个最大周期,必须满足:
c与m互质
a - 1可以被m的所有质因数整除
如果m是4的倍数,a - 1也必须是4的倍数
以上三条被称为Hull-Dobell定理。作为一个伪随机数生成器,周期不够大是不好意思混的,所以这是要求之一。因此才有了:a=9301, c = 49297, m = 233280这组参数,以上三条全部满足。
字母种子
由于数字0~9可以表示十进制,而加上a-z刚好是36进制,在这个区间内可以实现字母+数字的种子。
实现:
1 | const NUM36 = "0123456789abcdefghijklmnopqrstuvwxyz" |
大数处理
Java作为服务端,经常有部分数字是以64位的形式传递,可能会到19位,JS仅支持16位安全数字。可以先进行取模,再执行随机
1 | let seedOrigin = BigInt(3327170722379824600) |
- Title: 种子随机:线性同余生成器(LCG, Linear Congruential Generator)
- Author: Janing
- Created at : 2025-09-25 20:16:00
- Updated at : 2025-09-25 20:34:14
- Link: https://your-domain.com/种子随机:线性同余生成器(LCG, Linear Congruential Generator)/
- License: This work is licensed under CC BY-NC-SA 4.0.