2012-12-16 35 views
3
import java.util.Random; 

public class Fighter { 
int str; 
int dex; 
int hth; 
Random gen = new Random(1535636); 

public Fighter() { 
    str = gen.nextInt(9); 
    dex = gen.nextInt(9); 
    hth = gen.nextInt(14); 
} 


public int getHth(){ 

    return hth; 

    } 

public int getStr(){ 
    return str; 
    } 

public int getDex(){ 
    return dex; 
     } 
} 


import java.util.Random; 
public class Arena { 


public static void main(String[] args) { 
    Random gen = new Random(); 
     Fighter Guy1 = new Fighter(); 
     int x =1; 
       while (x < 200000000){ 
       x++; 
       } 
     Fighter Guy2 = new Fighter(); 

    int hth1 = Guy1.getHth(); 
    int hth2 = Guy2.getHth(); 

    System.out.println("Fight Start"); 
    System.out.println("---------------"); 
    //System.out.println(gen.nextInt(10)); 
    //System.out.println(gen.nextInt(17)); 
    System.out.println(Guy1.getStr()); 

    //Fighting 



} 



} 

每當我運行這個,我得到的結果不管是什麼。我希望每次都能製造2架隨機戰機。現在有幾行只是爲了確認它不會產生隨機數字。隨機發生器每次給我相同的號碼

有誰知道如何在構造函數中正確使用隨機數字嗎?還是我這樣做完全錯了?

回答

12

你提供恆定的種子值隨機數發生器:

Random gen = new Random(1535636); 

不要那樣做。它將始終提供相同的值。只需調用默認的構造函數:

Random gen = new Random(); 

創建一個新的隨機數發生器。它的種子被初始化爲基於當前時間的值:

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Random.html#Random()


爲什麼?

與大多數「標準庫」隨機數生成器,Random"Pseudorandom number generator"。這意味着它不是實際上是生成隨機數字!相反,它是以非常明確的方式計算它們 - 它們只是看起來像隨機數字,並且它們傾向於有一個不錯的分佈。

使用種子值來初始化PRNG,其設置它們的內部狀態。如果每次都提供相同的種子值,那麼PRNG每次運行時都會處於相同的狀態,從而提供相同的數字序列!

,使它們看起來隨機的所有時間的事情,是通常他們是「播種」在默認情況下使用基於時間的價值。在大多數圖書館中,這是一個非常精確的時間價值。所以大多數時候,如果你看到有人播種他們的PRNG,這可能是不正確的,或者至少是非常不必要的。

1 - 注:這是不rand() libc中的情況下:「如果沒有提供種子值時,rand()函數自動地與值1。接種」

+0

謝謝你,我認爲種子會和當前時間一起使用。 – tekno45

4

現在你正在初始化具有相同種子的隨機數發生器。這將使它每次都產生相同的數字序列。你想被大家使用no-arg constructor

Random gen = new Random(); 

按照documentation

這個構造函數隨機數生成的種子很可能是從這個構造函數中的任何其他調用不同的值。

+0

噢好吧,我認爲這是與當前時間一起使用的種子。 – tekno45

相關問題