2014-01-29 67 views
3

我需要一些建議。我想創建一個邏輯從52張牌組中一次隨機選擇一張牌,直到所有牌都被選中,如果使用了所有52張牌,我需要重新洗牌並重新開始。正確的邏輯從卡組中隨機選擇一張卡片,直到選中所有卡片

我已經創建了這個工作正常的邏輯,但我認爲應該有一些更好的方法來做到這一點。一些MMM - 數學大師頭腦可以結束我的痛苦。

這裏的邏輯:

  1. 創建一個空的ArrayList來存儲所有52張檢查
  2. 隨機選擇一個卡,並檢查是否在ArrayList中
  3. 如果是,重複步驟存在2
  4. 如果沒有,添加卡的ArrayList
  5. 如果數組列表大小是52,空該ArrayList

    ArrayList<Integer> list = new ArrayList<Integer>(); 
    int card = -1; 
    
    do { 
        Random random = new Random(); 
        card = random.nextInt(52); 
    } while (list.contains(card) == true); 
    
    // code for drawing the card by the number 
    list.add(card); 
    

這個邏輯唯一的問題是當有隻留下了一張卡,還有通過隨機獲得該卡的不到2分%的機會。系統花費大量時間來查找該卡。它會繼續檢查while循環。

請提出改進​​建議並感謝您的時間。

+0

我看不到你的循環如何結束。 – Maroun

+2

這不是一個非常有效的解決方案,但我真的懷疑係統會花費很多時間來做這件事。電腦速度非常快。 – Keppil

+1

電腦幾乎像Usain Bolt一樣快。 – Maroun

回答

7

一種選擇是從一個包含所有卡片的完整數組列表開始,然後刪除一個隨機索引,直到列表爲空,此時您需要重新填充它。

實施例:

ArrayList<Integer> list = new ArrayList<Integer>(); 
for(int i=0;i<52;i++){ 
    list.add(i+1); 
} 
int c = 52; 
Random random = new Random(); 
while(c>0){ 
    int r = random.nextInt(c--); 
    int card = list.get(r); 
    list.remove(r); 
} 
resetList(); 
+0

這將是亞歷克斯,你不覺得嗎? –

+1

這是不一樣的,這個邏輯沒有重試。 +1 – Keppil

+1

在這種情況下,您不需要檢查卡是否在列表中。 – Alex

相關問題