2012-03-21 55 views
0

我有一個隨機和數組的問題。我列出了一個空列表,我想添加8個隨機值,但我不希望某些值相同。爲了得到一些隨機值,我用這個代碼:數組和隨機值

 for (int i = 0; i < 8; i++) { 
      round = random.nextInt(31); 
      while (temp.get(round).equals(mix)) { 
       round = random.nextInt(31); 
      } 
      mix.add(temp.get(round)); 
     } 

溫度是32級的對象列表,並把我的列表,我想補充8個隨機值。但是當我隨機抽取一些值時,我會得到相同的值。我如何獲得隨機值,但沒有重複?

+0

您可以將數組轉換爲列表並使用arraylist的contains方法來檢查它是否存在。如果沒有,請添加它。否則,生成一個新的,然後再試一次。轉換爲列表可以通過Arrays.asList()完成(如果您使用的是Java 6) – 2012-03-21 08:52:48

+0

[O(1)中的唯一隨機數的可能重複?](http://stackoverflow.com/questions/196017/獨特的隨機號碼,在-01) – paxdiablo 2012-03-21 09:58:53

回答

2

雖然其他人描述的方式來實現一個新的解決方案,我想你可以通過改變單一的線固定:

while (temp.get(round).equals(mix)) 

我猜條件應該檢查​​是否埃爾temp的位置round已在mix中。這應該這樣做:

while (mix.contains(temp.get(round)) 

於第一線的問題是,equals被定義爲一個對象比較其他任何類型的對象,因此比較了temp的元素,它可能不是一個集合本身,對mix,這是。因此,條件總是錯誤的。 Collection.contains是使用的方法,並且您需要使用mix之一。 (正如其他人也指出的,Set最適合於經常應用contains的情況,但對於8種情況,根據需要,mix是否爲List取而代之並不重要)。

[編輯]:順便說一句:因爲在random.nextInt(int)上限被排除在外,你應該永遠只能得到32尺寸temp的最終元素在你的mix如果使用nextInt(32)

3

您可以使用基本上保持所有可能值列表的shuffle列表,並在返回給您時刪除它。這通常被稱爲費希爾 - 耶茨洗牌。

從列表中刪除返回的項目會阻止相同的數字被返回兩次,您可以看到更多細節,以及Java實現here

3

做一個32個對象的集合,隨機播放它們,並取其中的前8個。

List <Integer> list = new ArrayList <Integer>();  
for (int i = 0; i < 32; ++i) 
{ 
    list.add (i); 
} 
Collections.shuffle (list); 
1

您可以添加你的號碼給Set。繼續添加項目,直到您的設置具有正確數量的項目。

while (set.size() < n) 
{ 
    int item = random.nextInt(m); 
    set.add(item); 
} 

請注意,這可能會在大多數情況下表現良好。但是,如果n很大而m - n很小,則它將表現不佳。

1

使用設置。把你的rundom值來設置,直至其大小等於你的預定數量(例如,8):

Random random = new Random(System.currentTimeMillis()); 
Set<Integer> randomSet = new HashSet<Integer>(); 
while(randomSet.size() < 8) { 
    randomSet.add(random.nextInt(31)); 
} 
// now random set contains 8 different random numbers. 
0
 int randomCounter = 31; 

     for (int i = 0; i < 8; i++) { 
     round = random.nextInt(randomCounter); 
     int roundInTemp = temp.get(round); 
     mix.add(rountInTemp); 
     temp.remove(roundInTemp); 
     randomCounter--; 
    } 

另一種方法是重新洗牌的臨時列表(algorith你找到罰款),並使用list.sublist(0, 8)