2011-10-11 73 views
7

誰能告訴我如何在不重複 例如機器人 - 產生隨機數且無重複

隨機(10)應該(可能)返回3,4,2,1,7,6產生隨機數,5,8,9,10沒有重複

感謝

+0

它會幫助你:http://stackoverflow.com/questions/4040001/java-creating-random-numbers-with-no-duplicates – Thiru

回答

25

我建議添加數字到ArrayList<Integer>,然後使用Collections.shuffle()隨機化他們的訂單。例如:

ArrayList<Integer> number = new ArrayList<Integer>(); 
for (int i = 1; i <= 10; ++i) number.add(i); 
Collections.shuffle(number); 
+0

喜歡它!一個問題,如果我執行兩次或三次Collection.Shuffle它會提供不同的順序? – Yogesh

+0

我很確定它會。我找不到它不應該的原因。很容易檢查,呃? ;) –

4

列出生成的數字,當您新生成的數字已經在此列表中時,您將創建一個新的隨機數。

Random rng = new Random(); // Ideally just create one instance globally 
List<Integer> generated = new ArrayList<Integer>(); 
for (int i = 0; i < numbersNeeded; i++) 
{ 
    while(true) 
    { 
     Integer next = rng.nextInt(max) + 1; 
     if (!generated.contains(next)) 
     { 
      // Done for this iteration 
      generated.add(next); 
      break; 
     } 
    } 
} 
+0

不幸的是,這種方法不能很好地擴展 –

-2

如果只有幾個數字,小於100,我想我的解決辦法是創建一個布爾數組,一旦你得到一個數字,設置數組爲true的位置。我認爲直到所有數字出現都不需要很長時間。希望能幫助到你!

乾杯!

2

我的兩分錢

public Collection<Integer> getRandomSubset(int max,int count){ 
    if(count > max){ 
     throw new IllegalArgumentException(); 
    } 
    ArrayList<Integer> list = new ArrayList<Integer>(); 
    for(int i = 0 ; i < count ;i++){ 
     list.add(i); 
    }  
    Collections.shuffle(list); 
    return list.subList(0, count); 
} 
+0

我喜歡這個解決方案中的'subList()'增強功能 - 非常適合處理一副牌 –