2012-03-02 128 views
0

我試圖在0和1之間生成幾個隨機雙打。這是我運行的代碼,但返回的數字非常接近。我希望統一分佈在[0,1]或至少[0,1]的數字。我生成隨機數字:更新種子

public class MyClass 
long seed = System.currentTimeMillis(); 
...... 
public double returnRandom() { 
    Random rand = new Random(); 
    seed += 4; //update the seed 
    rand.setSeed(seed); 
    return rand.nextDouble(); 
} 

(遍歷數組來填充)我結束了:

[0.10233441769044727]

[0.10484270731218648]

[0.1044843653222054]

[0.10412603823338551]

+0

爲什麼更新種子而不是存儲'Random'的實例? – amit 2012-03-02 10:52:03

+0

您的隨機值彼此接近,因爲您所有的「隨機」實例正在使用幾乎彼此相等的種子值。 Duffymo的解決方案應該可以工作... – quaylar 2012-03-02 10:54:13

回答

4

我建議你不更新的種子。你也應該使Random成爲一個類實例,而不是每次調用該方法時都實例化一個實例。

public class MyClass { 
    private Random random = new Random(System.currentTimeMillis()); 

public double returnRandom() { 
    return this.random.nextDouble(); 
} 
} 
1

你不需要更新你的0的種子對象 - 事實上,這可能是一件壞事。

Random r = new Random(); 
    for(int i=0; i<10; i++){ 
     System.out.println(r.nextDouble()); 
    } 

輸出:

0.42997799629765443 
0.025965300992295326 
0.6819794805907442 
0.5766417169200183 
0.2709962942207633 
0.5094285626768145 
0.9364741774517189 
0.7849361529399873 
0.512486723637452 
0.32604095225979 
1

嘗試Math.random()它給在[0,1均勻分佈) - 它創建的幕後隨機對象,並使用相同的一個隨後所有的電話。例如

public double returnRandom() { 
    return Math.random(); 
} 
+0

使用Math.random()和Random類有什麼好處嗎? – user994165 2012-03-02 21:14:52

+0

簡單的代碼。正如我所說,它創建了一個隨機的實例,但你不必處理。 – Robert 2012-03-03 00:01:55