2013-04-23 77 views
3

我遇到了一個問題,在Java中產生6到6之間的隨機數。所有的數字必須是唯一的。當我輸入kolon值爲5時,陣列應該是這樣的:如何使用Java在1到6之間生成6個隨機數?

1 2 3 4 5 6 
1 2 3 4 5 6 
1 2 3 4 5 6 
1 2 3 4 5 6 

我不希望程序生成相同的兩個數字。這裏有什麼問題?

相關的代碼:

public static void main(String[] args) { 
    Scanner input = new Scanner(System.in); 
    System.out.println("Please enter row quantity: "); 

    int kolon = input.nextInt(); 

    Integer[][] dizi_asil = new Integer[kolon][6]; 

    for (int i = 0; i < kolon; i++) { 
     Integer[] dizi = new Integer[6]; 

     for (int j = 0; j < 6; j++) { 

      dizi[j] = (int) ((Math.random() * 6) + 1); 

      for (int u = 0; u < 1; u++) { 

       for (int k = 0; k < j; k++) { 

        while (dizi[k] == dizi[j]) { 
         dizi[j] = (int) ((Math.random()* 6) + 1); 
         u++; 
        } 

       } 
      } 
      dizi_asil[i][j] = dizi[j]; 
     } 
     Arrays.sort(dizi_asil[i]); 
    } 

    for (int i = 0; i < dizi_asil.length; i++) { 
     for (int k = 0; k < dizi_asil[i].length; k++) { 
      System.out.print(dizi_asil[i][k] + "\t"); 
     } 
     System.out.println(); 
    } 
+4

6 1和6之間的唯一號碼不是隨機的。他們將永遠是1,2,3,4,5,6。他們的順序可能是隨機的,但不是數字。 – jlordo 2013-04-23 16:03:18

+0

爲什麼4行如果kolon = 5在你的例子中? – NINCOMPOOP 2013-04-23 16:04:42

+1

另外,你正在調用'Arrays.sort(dizi_asil [i]);'。那麼,爲什麼你期望你的數組不被排序? – jlordo 2013-04-23 16:08:24

回答

5

一個非常簡單的修復 - 用u--;代替u++;++將使循環停止,--將使其繼續。

雖然我會建議更像下面的東西。我希望這很容易理解。

Integer[] dizi = new Integer[6]; 

for (int j = 0; j < 6; j++) 
{ 
    boolean isValid; 
    do 
    { 
    dizi[j] = (int) ((Math.random() * 6) + 1); 
    isValid = true; 
    for (int k = 0; isValid && k < j; k++) 
     if (dizi[k] == dizi[j]) 
      isValid = false; 
    } 
    while (!isValid); 
    dizi_asil[i][j] = dizi[j]; 
} 

我也建議the Random class,其中有一個nextInt(int)方法,這是優於(int) ((Math.random() * 6) + 1)

但洗牌可能是一個更快的方法來做到這一點。或者像使用其他答案一樣使用API​​,或者查看Fisher-Yates/Knuth shuffle以獲得簡單的隨機播放算法。

+0

非常感謝你,你一直很有幫助 – 2013-04-23 16:46:45

6

這是一種簡單的方法:

List<Integer> list = Arrays.asList(1,2,3,4,5,6); 
Collections.shuffle(list); 
// you can convert it to an array if you need to. 
+0

例如:當我運行程序,某些時候即時獲取1 6。這是錯誤的,我必須始終得到1 2 3 4 5 6 – 2013-04-23 16:24:22

+2

@ user2204772:然後停止使用低效率(和bug)的方式,並使用我提供的代碼片段。 – jlordo 2013-04-23 16:26:17

7

創建包含1至6的列表,然後使用Collection.shuffle洗牌它。然後你會得到隨機的唯一編號

+1

棘手的答案。 +1 :) – 2013-04-23 16:07:32

3

嘗試Collections.shuffle(list);

List<Integer> list = new ArrayList<Integer>(); 
for(int i = 1; i<7 ; i++) 
    list.add(i); 

或者,你可以這樣做:

List<Integer> list = Arrays.asList(1,2,3,4,5,6) 

Collections.shuffle(list); 

迭代列表,每次得到的獨特價值。

1

一個更簡短的方法是使用洗牌,因爲許多人已經提到過。

public static void main(String... ignored) { 
    Scanner input = new Scanner(System.in); 
    System.out.println("Please enter row quantity: "); 

    List<Integer> rolls = Arrays.asList(1, 2, 3, 4, 5, 6); 
    for (int i = 0, rows = input.nextInt(); i < rows; i++) { 
     Collections.shuffle(rolls); 
     System.out.println(rolls); 
    } 
} 

,如果你運行它,你喜歡的東西

Please enter row quantity: 
5 
[5, 6, 3, 2, 4, 1] 
[5, 4, 3, 6, 2, 1] 
[6, 4, 2, 3, 5, 1] 
[3, 1, 6, 2, 5, 4] 
[4, 1, 6, 3, 5, 2] 
0

進口:

import acm.util.RandomGenerator; 
private RandomGenerator rgen = RandomGenerator.getInstance(); 

其實採摘:

randnum = rgen.nextInt(1, 6); 

此挑選0和5之間的隨機數你可以在1到6之間做這個:

randnum = rgen.nextInt(2, 7); 

或者:

randnum = rgen.nextInt(1, 6); 
randnum++; 
相關問題