2012-12-26 184 views
2

我需要用可能的50個5個隨機數填充數組A.我們允許重複數據。然後,我需要再次填充同一個數組,但使用的唯一數字不會出現在數組的第一次或第二次填充中。我正在使用下面的代碼來第二次生成數組。我被困在如何搜索第一個數組同時重複。任何幫助感謝!由於數組中的隨機數

boolean drawn; 
    for (int i=0; i<A.length; i++) { 
      do { 
        drawn = false; 
        A[i] = 1 + (int)(Math.random() * 50); 


        for (int j=0; j<i; j++) 
          if (A[i] == A[j]) 
           drawn = true;                    

      } while (drawn); 
+3

我會在紙上繪製邏輯。你可以使用if-then邏輯,但我認爲有很多方法可以爲這個貓皮膚 – Coffee

+0

如果你使用'List'而不是數組,你可以利用[contains()](http://docs.oracle.com)。 com/javase/6/docs/api/java/util/List.html#包含%28java.lang.Object%29)方法。 –

回答

1

使用列表<>讓所有允許號碼的跟蹤,併爲你使用它們,從列表中刪除。然後,對於你的第二次通過,而不是總是得到一個隨機數* 50,得到一個隨機數*列表大小()。那麼你使用的實際數字是list.get(location)而不是數字。

(您的列表將以1,2,3,4,5開頭,但當使用3時,列表將變爲1,2,4,5,...,因此,當您獲得3下一個「隨機的()」號,這實際上是一個4)

0

商店的規模50

數組random你的50名隨機數的候選人保持初始設置爲random.length。所以一個櫃檯,這裏counter將被初始化爲49.

然後從0生成一個數字rcounter-1並選擇random[r]作爲您的號碼。

現在繼續並使用random[counter-1]替換random[r]。遞減counter,以便下次只搜索數組的前49個元素,並在您選擇數字時繼續此過程。

現在只是如果你想,你以前沒有選擇一個數字,從0counter-1使random[r]來自陣列,這將是在年初的獨特元素產生r

int[] randoms= new int[50]; 
    . 
    . //populate your array with the candidate numbers 
    . 
    int counter= randoms.length; 
    Random rand = new Random(); 

    public int getUnique(){ 
     //Get a random number in the range 0 to counter-1 
     int r = rand.nextInt(counter); 
     int myElement = randoms[r]; 
     randoms[r] = randoms[counter-1]; 
     randoms[counter-1]= myElement; 
     counter--; 
     return myElement; 
    } 

,只要你想,以允許重複,產生從0rrandom.length -1並選擇random[r]爲你的電話號碼。請注意,我們還是要保持跟蹤所用的數字,使getUnique()仍然有效:

public int getAny(){ 
     //Get a random number in the range 0 to random.length-1 
     int r = rand.nextInt(random.length); 
     int myElement = randoms[r]; 
     if(r < counter){ 
     randoms[r] = randoms[counter-1]; 
     randoms[counter-1]= myElement; 
     counter--; 
     } 
     return myElement; 
    } 
0

您可以創建一個列表包含您的50個號碼,並使用隨機獲得0-50的5個索引,創建你的第一個隨機數組。

對於第二遍,創建第一個列表的副本,但刪除第一個隨機數組中的數字。然後洗掉第二個列表(使用Collections.shuffle()),並取5個第一個元素。

0

如果需要存儲以前的數組元素,則每次要填充數組時都必須使用一個額外的數組。喜歡的東西:

boolean drawn; 
System.arraycopy(A, 0, B, 0, A.length); 
for (int i=0; i<A.length; i++) { 
     do { 
       drawn = false; 
       A[i] = 1 + (int)(Math.random() * 50); 

       for (int j=0; j<A.length; j++) 
         if (A[i] == B[j]) 
          drawn = true; 

       for (int j=0; j<i; j++) 
         if (A[i] == A[j]) 
          drawn = true;                    

     } while (drawn); 

`

+0

謝謝!完美地解決了這個問題! – MarcusRey

+1

@ user1930614 ..不要只複製代碼。試着瞭解究竟發生了什麼。從長遠來看,這將對你有所幫助。 –

1

我這樣做:

List<Integer> choices = new ArrayList<Integer>(); 
Random r = new Random(); 
for(int i = 0; i <N;i++) 
{ 
    choices.add(r.nextInt(N-1)+1; 
}  
Set<Integer> uniques = new HashSet<Integer>(); 
Collections.shuffle(uniques); 
//remove first 5 entries from uniques 
//repeat for second pass 

當然,這樣做的可能性(如最小的,因爲它是),將有剩餘的小於設定大小5.