2010-04-04 39 views
6

我已經被賦予了將Java的Java.util.Random()移植到JavaScript的任務,並且我已經在足夠多的數字上使用Javascript中的按位運算符運行了巨大的性能命中/不準確性。一些粗略的研究表明,「JavaScript中的按位運算符本質上很慢」,因爲在內部看來,JavaScript會將其所有雙精度值轉換爲帶符號的32位整數來執行按位運算(see here以獲取更多信息。)因此,我不能做一個Java隨機數生成器的直接端口,我需要得到與Java.util.Random()相同的數值結果。寫的東西像Javascript中的48位按位運算?

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

在JavaScript中,48位按位操作是不可能的。你可以用兩個數字來模擬它。

0

另一種方法是使用48個布爾值的布爾數組,並實現自己的移位。不過,我不知道這是否更快。但我懷疑它,因爲所有的布爾值都被存儲爲雙打。

0

記住,比特移位直接相當於一個乘法或除法通過2.

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

它比比特移位較慢的功率,但可以延伸超過32位。它可能是一個更快的解決方案bits > 32,一旦你考慮到需要支持更高位數的附加代碼,但你必須做一些分析才能發現。

4

而不是foo & ((1 << 48) - 1)你應該能夠使用foo % Math.pow(2,48)

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