2013-11-22 54 views
0

我試圖使用枚舉生成隨機數字(1到10)。變量「num」沒有得到更新的隨機值,不知道我在做什麼錯誤。任何指針都會有幫助。謝謝。如何在Java中使用ENUM生成隨機數字

Java代碼:

enum RandomNumbers 
    { 

    ONE, 
    TWO, 
    THREE, 
    FOUR, 
    FIVE, 
    SIX, 
    SEVEN, 
    EIGHT, 
    NINE, 
    TEN; 

    public static RandomNumbers getRandom()  
    { 
     return values()[(int)(Math.random() * values().length)]; 
    } 
    } 


    public class RandomNumbersEnum 
    { 

    public static void main(String[] args) 
    { 

     RandomNumbers randN = RandomNumbers.getRandom(); 

     int num = 0; 


     if (randN.values().equals("ONE")) 
     num = 1; 
     else if(randN.values().equals("TWO")) 
     num = 2; 
     else if(randN.values().equals("THREE")) 
     num = 3; 
     else if(randN.values().equals("FOUR")) 
     num = 4; 
     else if(randN.values().equals("FIVE")) 
     num = 5; 
     else if(randN.values().equals("SIX")) 
     num = 6; 
     else if(randN.values().equals("SEVEN")) 
     num = 7; 
     else if(randN.values().equals("EIGHT")) 
     num = 8; 
     else if(randN.values().equals("NINE")) 
     num = 9; 
     else if(randN.values().equals("TEN")) 
     num = 10; 
     System.out.println("The random number is: " + num); 
    } 
    } 
+1

什麼錯'java.util.Random.nextInt(9)+ 1;'? – assylias

+2

@assylias,生成範圍1-9,而不是1-10 :) – kviiri

+1

是的,這只是...尷尬 – Rogue

回答

2

你可以嘗試使用Random類的Java,我讓你一些例子:

Random r = new Random(); 
int number = r.nextInt(10)+1; 
System.out.println(number); 
+0

OP指定的範圍是一到十(包括根據問題),而不是零到九。否則,一個好的,簡潔的答案。 – kviiri

+1

你是對的,我編輯 – jandresrodriguez

+0

謝謝胡安。隨機類可以與枚舉類型一起使用嗎? – Sohel

1

,這不工作的原因是,你的if語句正在測試枚舉所有RandomNumbers實例的數組是否等於某個String。當然,它永遠不會。當您撥打randN.values()時,實際上您正在調用靜態方法RandomNumbers.values(),這與您在getRandom()方法中使用的方法相同。如果你想要一個字符串,你可以比較,randN.name()會工作,但它不是一個好主意。

如果硬要比較的東西,你應該使用一個身份比較,像這樣:

int num; /* Notice I'm not prematurely assigning meaningless garbage here. */ 
if (randN == RandomNumbers.ONE) 
    num = 1; 
else if(randN == RandomNumbers.TWO) 
    num = 2; 
else if(randN == RandomNumbers.THREE) 
    num = 3; 
else 
    throw new IllegalArgumentException("Unrecognized RandomNumber: " + randN); 

下一步的發展將是使用switch聲明:

int num; 
switch(randN) { 
    case ONE: num = 1; break; 
    case TWO: num = 2; break; 
    case THREE: num = 3; break; 
    default: throw new IllegalArgumentException(); 
} 

你AREN」好好利用枚舉。下面是需要一個enum類型的充分利用的方法:

public enum RandomNumber { 

    ONE(1), 
    TWO(2), 
    THREE(3); 

    private final int value; 

    private RandomNumber(int value) 
    { 
    this.value = value; 
    } 

    public int getValue() 
    { 
    return value; 
    } 

    public static RandomNumber roll() 
    { 
    RandomNumber[] values = values(); 
    int idx = ThreadLocalRandom.current().nextInt(values.length); 
    return values[idx]; 
    } 

    public static void main(String... argv) 
    { 
    RandomNumber num = RandomNumber.roll(); 
    System.out.printf("The random number is %s (%d).%n", num, num.getValue()); 
    } 

} 
+0

謝謝埃裏克森。我試過你的第一個解決方案,它工作。我沒有比較我理解的正確價值。我現在將嘗試你所展示的最後兩種技巧。謝謝。 – Sohel

+0

最後一個解決方案顯示以下編譯時錯誤消息:RandomNumber2.java:3:錯誤:枚舉RandomNumber2中的構造函數RandomNumber2不能應用於給定類型; 一(1), ^ 要求:無參數 發現:整數 原因:實際的和正式的參數列表長度 – Sohel

+0

你複製和粘貼代碼有什麼不同?我認爲這個問題是由於你對類型的重命名造成的,也許忘記了在任何地方更新名稱,或者你沒有準確地複製構造函數等等。我的答案中的代碼缺乏導入。 – erickson