2012-03-28 21 views
5

java.util.Randomnext方法,當我在Eclipse中查看源代碼,基本上是:java.util.Random實現在JRE或平臺之間有所不同嗎?

seed = (seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1); 
return (int)(seed >>> (48 - bits)); 

我如何確定不同的JDK或的JVM以不同的方式或不同的常量實現next

我已經遇到了Weird behaviour when seeding Java Random中的不同無參構造函數。我想知道next方法是否會出現類似的情況。我在哪裏可以找到不同實現的源代碼?

+0

如果絕對必須是一樣的,我會採取的一個副本代碼並使用它。雖然文件建議這不應該需要。 – 2012-03-28 12:46:04

回答

5

Javadoc爲Random.next()明確指出使用哪種算法來生成下一個數字。

從理論上講,不同的JVM可能會使用不同的算法,但這不太可能,尤其是如果您將自己限制爲基於Sun/Oracle庫的JVM。


這是否文檔不一定適用於所有的JDK?

你需要檢查確定,但可能是的。 Sun/Oracle不太可能改變這種情況,因爲在過去15年左右的時間裏,有可能會破壞大量現有的Java應用程序和測試套件。

這裏有一些事實:

  • 通過Java 1.7(*)的Javadoc的Java 1.3.1包含此方法完全相同的規格,

  • 的實現只允許使用如果符合規範,則爲商標「Java」

  • 大多數(如果不是全部的話)Java(TM)實現使用從Oracle/Sun源代碼派生的類庫,

  • 開發人員會注意到使用了不同的算法......並大聲抱怨。

因此,使用不同算法的Java(TM)實現的可能性非常小。

(*我找不到Java聯機1.1的javadoc,但我希望他們會說同樣的事情。)

+0

我認爲契約可能是一個更一般的「生成一個隨機數......」,因此在理論上允許對實現進行更改而不會破壞任何內容。 – Flash 2012-03-28 12:35:24

+0

@安德魯 - 不要假設。閱讀javadocs。 – 2012-03-29 08:57:01

4

如何確定不同的JDK或JVM是否會以不同的方式或以不同的常量執行下一個操作?

通過在不同JVM上的程序中使用相同的種子並查看是否獲得相同的序列,因爲該序列對於給定的種子是確定性的。

我不知道的JDK被允許使用不同的算法,不過,作爲documentation for next說:

方法nextRandom類由原子更新種子

(seed * 0x5DEECE66DL + 0xBL) & ((1L << 48) - 1)實施

,並返回

(int)(seed >>> (48 - bits)).

這是一個線性同餘僞隨機數發生器,由D. H.萊默所定義和由Donald E. Knuth的在描述的計算機的技術編程,第3卷:半數值算法,第3.2.1節。

...這似乎是設置特定的合同,儘管只是它說

next常規協定是它返回一個值int之前如果參數bits1之間(大約),那麼返回值的許多低位將是(近似)獨立選擇的比特值,其中每個比特值(近似)相等地可能是01

...所以也許這是允許在算法上擺動的空間。

哪裏可以找到不同實現的源代碼?

如果他們是開源的,大概你可以在項目的回購中找到實現。如果他們關閉,那麼......

+0

該文檔是否適用於所有JDK? – Flash 2012-03-28 12:26:10

+0

@ Andrew:鏈接的文檔是Java 7 SE的官方文檔,不是特定的JDK。所以是的,它適用於所有符合標準的JDK。與官方文檔不同的JDK不符合規定。 – 2012-03-28 12:29:17

相關問題