2013-04-29 128 views
7

我試圖用一個朋友在Java中解釋隨機數發生器,當他每次運行該程序時都會得到相同的數字。我創建了自己的更簡單的版本,並且每次運行該程序時都會得到相同的確切數字。Java隨機數不是隨機的嗎?

我在做什麼錯?

import java.util.*; 

public class TestCode{ 
    public static void main(String[] args){ 
     int sum = 0; 
     Random rand = new Random(100); 
     for(int x = 0; x < 100; x++){ 
      int num = (rand.nextInt(100)) + 1; 
      sum += num; 
      System.out.println("Random number:" + num); 
     } 
     //value never changes with repeated program executions. 
     System.out.println("Sum: " + sum); 
    } 

} 

最後五個號碼的開出的100元是:

40 
60 
27 
56 
53 
+1

,我認爲是更好的方式使用的Math.random()。 – Gere 2013-04-29 23:48:51

+6

你在創建你的Random實例時使用了一個常數種子。所以當然你會得到相同的數字。 – 2013-04-29 23:51:22

+3

@Gere:'Math.random()'有什麼神奇之處,爲什麼它比使用Random實例更好? – 2013-04-29 23:51:59

回答

23

您已經播種,隨機數生成具有恆定值100。它是確定性的,所以每次運行都會產生相同的值。

我不知道你爲什麼選擇與100種子,但種子值無關,與被產生的(這是通過其他方式來控制,比如調用nextInt值的範圍內,你已經有)。

要每次獲得不同的值,請使用不帶參數的構造函數Random,該函數使用系統時間爲隨機生成器播種。

從的Javadoc報價爲參數的構造函數Random

創建一個新的隨機數發生器。此構造函數將隨機數生成器的種子 設置爲非常可能與此構造函數的任何其他調用不同的值 。

引用的實際代碼的參數的構造函數Random

public Random() { 
    this(seedUniquifier()^System.nanoTime()); 
} 
2

此:

Random rand = new Random(100); 

你給隨機數生成相同的種子(100),每次啓動該程序。給它類似於從System.currentTimeMillis()的輸出,並應該給你每個調用不同的數字。

1

隨機數發生器實際上只是僞隨機的。也就是說,他們使用確定性手段來生成序列,這些序列在給定的統計標準下是隨機的。

Random(long seed)構造函數允許您傳入確定僞隨機數序列的種子。

0

希望這有助於..

Random r = new Random(System.currentTimeMillis()); 
double[] rand = new double[500]; 
for(int i=0;i<100;i++){ 
    rand[i] = r.nextDouble(); 
    //System.out.print(rand[i] + "\n"); 
} 
//System.out.println(); 
return rand[randomInt];