我正在尝试将旧的 C 标准 rand()
函数移植到 JavaScript 以进行测试。我不打算在实际场景中使用它,所以请不要因为它不安全而感到害怕。
这是函数的 C 实现:
seed = seed * 1103515245 + 12345;
return (seed/65536) % 32768;
其中 32768 是 RAND_MAX
。所以我尝试将其移植到 Javascript:
Random = function(p) {
this.s = p;
this.rand = function() {
this.s = this.s * 1103515245 + 12345;
return Math.floor((this.s / 65536) % 32768);
};
};
let r = new Random(Math.floor(new Date() / 1000));
console.log(r.rand()); // gives expected results
console.log(r.rand()); // second call produces 0
当我第一次调用 r.rand()
时,它产生了预期的结果。但是每次连续调用 r.rand()
都会给我 0,我很好奇为什么……
最佳答案
问题是这一行 this.s = this.s * 1103515245 + 12345;
显着增加了 this.s
的值,所以通过添加模数232 – 1 数字被限制以产生预期的结果,就像在 C 中一样。
rand() {
this.seed = (this.seed*1103515245 + 12345) % 4294967295;
return (this.seed / 65536) % 32768;
}
这可能不是最好的解决方案,但它确实解决了这个问题。
一个模数 Number.MAX_SAFE_INTEGER
在这种情况下也可以工作,但是由于目标是保持它与 C 同步,因此 232 – 1 可以正常工作。
关于Javascript 自定义 prng 连续调用产生 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57925315/