如何将C语言48位LCG位运算随机数生成代码正确转译为JavaScript
问题原因
你写的JS代码和C代码逻辑不一致核心有3个问题:
- JS默认的按位运算符仅支持32位有符号整数运算,你代码中
1 << 48会被截断为1 << 16,计算得到的掩码完全不符合预期 - C代码中
seed是64位长整型,运算全程是精确的整数运算,JS默认的Number类型虽然在48位范围内不会有精度丢失,但按位操作的32位截断会导致中间运算结果错误 - C代码返回时会将结果强转为32位有符号
int类型,JS代码没有做对应转换,符号位计算结果不一致
修复方案
使用ES6新增的BigInt类型处理大整数运算,完全对齐C代码的整数运算逻辑,修复后的代码如下:
let seed = 0n; function next(bits) { seed = (seed * 0x5DEECE66Dn + 0xBn) & ((1n << 48n) - 1n); return Number(BigInt.asIntN(32, seed >> (48n - BigInt(bits)))); } for (let i = 0; i < 20; i++) { console.log(next(31)); }
改动说明
- 所有和
seed相关的运算都用后缀带n的BigInt字面量,避免32位截断问题 - 用
BigInt.asIntN(32, ...)模拟C语言中将结果强转为32位有符号int的逻辑,保证返回值和C代码完全一致
内容的提问来源于stack exchange,提问作者Mikhael Abdallah
相关产品推荐
相关产品推荐

