2011-11-08 37 views
15

Java中的以下簡單程序使用java.util.Random類,因此它始終顯示「hello world」。代碼片段可以在下面看到。爲什麼使用Random和硬編碼種子總是會產生相同的結果?

package nomain; 

import java.util.Random; 

final public class J 
{ 
    public static String randomString(int seed) 
    { 
     Random rand = new Random(seed); 
     StringBuilder sb = new StringBuilder(); 

     for(int i=0;;i++) 
     { 
      int n=rand.nextInt(27); 
      if (n==0) 
      { 
       break; 
      } 
      sb.append((char) ('`'+n)); 
     } 
     return sb.toString(); 
    } 

    public static void main(String args[]) 
    { 
     System.out.println(randomString(-229985452)+' '+randomString(-147909649)); 
    } 
} 

有,它總是顯示一些奇怪的「Hello World」,即使使用的隨機類引起的隨機數,因此產生的數字應該是在每次運行變化和相應的字符應該相應地改變,但它總是隻顯示一個穩定的字符串,就像上面提到的「hello world」一樣。爲什麼會發生?

+0

這可能與隨機數生成器具有確定性......這意味着,如果使用相同的種子值,每次都會生成相同的序列。但我不積極。 – Bryan

+7

這個問題不是這個問題的重複。這個問題是這個問題的重複。 – Lion

回答

26

答案是傳入的參數。它用於播種隨機數生成器。

Random rand = new Random(seed); 

PRNGs並非真正的隨機 - 它們是確定性的,但被設計用來模擬隨機性。出於這個原因,它們被稱爲「僞隨機數發生器」。

對於給定的種子,PRNG將始終生成相同的數字。然後它可能使用它的最後一個結果作爲下一個值的輸入,所以通過給PRNG輸入一個已知值,您將始終生成一個已知序列的「隨機」數字。

數字-229985452和-147909649被稱爲種子,它會導致特定的PRNG產生5個數字的序列,可以解釋爲「hello」和「world」。如果你要改變這些數字,你會得到不同的5個字符的序列,但只要種子保持不變,它們對於程序的每次運行都是一樣的。

相關問題