Javascript 自定义 prng 连续调用产生 0

标签 javascript random

我正在尝试将旧的 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/

相关文章:

javascript - KnockoutJS/jQuery UI 可排序冲突

python - 如何用随机字典值填充 pandas 数据框列

algorithm - 需要一个算法来生成序列号

Cakephp-从数据库中随机选择并查看

javascript - 弹出 jQuery 模态后自动向上滚动

javascript - php 和 javascript 表单验证问题

php - 清除文本框字段后再次加载选择框

javascript - 在reactjs中离开页面后将值保存在表单中

objective-c - 如何让 rand() 更有可能选择某些数字?

c - 通过绕道减少非决定论?