我已经完成了将Java的Java.util.Random()
移植到JavaScript的任务,并且我在Javascript中使用按位运算符在足够大的数字上遇到了巨大的性能损失/不准确性。一些粗略的研究表明“JavaScript中的按位运算符本质上很慢”,因为在内部看来JavaScript会将其所有双值转换为带符号的32位整数来执行按位运算(see here以获取更多信息。 )因此,我不能直接使用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()
相同的值。我该怎么做才能建立一个更快速,更实用的端口?
答案 0 :(得分:4)
您可以使用foo & ((1 << 48) - 1)
而不是foo % Math.pow(2,48)
。
Javascript中的所有数字都是64位浮点数,足以表示任何48位整数。
答案 1 :(得分:0)
JavaScript中无法进行48位按位操作。你可以使用两个数字来模拟它。
答案 2 :(得分:0)
另一种方法是使用48个布尔值的布尔数组,并自己实现移位。不过,我不知道这是否更快;但我对此表示怀疑,因为所有布尔值都存储为双打。
答案 3 :(得分:0)
请记住,位移直接相当于乘法或除以2的幂。
1 << x == 1 * Math.pow(2,x)
它比位移慢,但允许您扩展到32位以上。一旦您考虑了支持更高位数所需的其他代码,可能成为bits > 32
的更快解决方案,但您必须进行一些分析才能找到答案。