6

我被赋予了将 Java 移植Java.util.Random()到 JavaScript 的任务,并且在足够大的数字上使用 Javascript 中的位运算符时,我遇到了巨大的性能损失/不准确性。一些粗略的研究表明“JavaScript 中的按位运算符本质上很慢”,因为在内部看来,JavaScript 会将其所有双精度值转换为有符号的 32 位整数来执行按位运算(有关此内容的更多信息,请参见此处。)因为这个,我不能直接移植 Java 随机数生成器,我需要得到与Java.util.Random(). 写类似的东西

  this.next = function(bits) {
    if (!bits) {
       bits = 48;
    }
    this.seed = (this.seed * 25214903917 + 11) & ((1 << 48) - 1);
    return this.seed >>> (48 - bits);
  };

(这几乎是 的直接端口Java.util.Random())代码将无法正常工作,因为 Javascript 无法对这样大小的整数进行按位运算。)

我发现我可以使用 Lehmer 算法在 32 位空间中创建一个可种子随机数生成器,但诀窍是我需要获得与使用Java.util.Random(). 我应该怎么做才能制作一个更快、功能更强大的端口?

4

4 回答 4

4

而不是foo & ((1 << 48) - 1)你应该能够使用foo % Math.pow(2,48).

Javascript 中的所有数字都是 64 位浮点数,足以表示任何 48 位整数。

于 2010-04-04T19:11:41.823 回答
0

JavaScript 中不可能进行 48 位按位运算。不过,您可以使用两个数字来模拟它。

于 2010-04-04T19:00:11.057 回答
0

另一种方法是使用由 48 个布尔值组成的布尔数组,并自己实现移位。不过,我不知道这是否更快;但我对此表示怀疑,因为所有布尔值都存储为双精度值。

于 2010-04-04T19:03:35.280 回答
0

请记住,位移直接相当于乘以或除以 2 的幂。

1 << x == 1 * Math.pow(2,x)

它比位移慢,但允许您扩展到超过 32 位。它可能是一个更快的解决方案bits > 32,一旦您考虑到支持更高位数所需的附加代码,但您必须进行一些分析才能找到答案。

于 2010-04-04T19:11:40.600 回答