2016-01-20 28 views
4

請問這樣:隨機種子之間的差異很重要嗎?

new java.util.Random(/* random seed */ 0) 
new java.util.Random(/* random seed */ 1) 

結果在某種程度上「隨機的」 /「更類似於」隨機生成比這個?

new java.util.Random(/* random seed */ 0) 
new java.util.Random(/* random seed */ 1000) 

換句話說:如果他們的隨機種子是相似的,我是否有從隨機生成器中獲得的類似系列的整數?

+5

這不是「更少」或「更多」隨機。它只是不同的隨機。 –

+4

你應該真的給[java.util.Random的好處](http://stackoverflow.com/questions/453479/how-good-is-java-util-random)讀取。它討論了Random類的優點(沒有弱種子)和弱點(實際上並非全部是隨機的)。 – azurefrog

回答

4

不,類似的種子不會產生相似的隨機數。
只有相同的種子會產生相同的數字。

設置種子的代碼是:

void setSeed(long seed) { 
    this.seed = (seed^0x5DEECE66DL) & ((1L << 48) - 1); 
..} 

此公式避免了this.seed得到simlar值對輸入的種子值(在構造函數中使用,或通過過setSeed()

然而那裏。是一些弱點,ALS在 http://dontpanic.42.nl/2011/03/when-random-isn-as-random-as-expected.html

1

用於產生僞隨機數的狀態更新解釋是chaotic。因此,使用在完全二相鄰的種子值的結果不同的狀態軌跡。

0

隨機數從來都不是隨機的。它們是完全預定義的,並且給定相同的種子總是會產生相同的數字,即使是超過一百萬次不同的命令運行,也就是它們被稱爲"Pseudorandom"的原因。最好的辦法是在每次程序運行時使用不同的值,例如當前的時間和日期以及/或者已經過的時鐘週期數等,這些值是不容易預測的。

+2

這不是問題。他想知道兩個相鄰的種子是否會產生相似的隨機數。 – AlexWien

+0

我解釋說他們從不產生隨機數字。這確實是對這個問題的回答。 –

+2

不是不是。你需要解釋輸入種子對兩個相鄰種子的影響,以及它們對輸出隨機數的影響。 – AlexWien