2016-09-18 89 views
0

我已經閱讀了很多有關該主題的內容,但我仍然對此感到疑慮。 請幫忙!在Java中洗牌一套

我創造的52張一副撲克牌:

int[] deck = new int[52]; 
for (int i = 0; i < deck.length; i++) {deck[i] = i;} 

現在,我想正確的洗牌,而不是按照任何圖案或功能。

我將使用的Math.random()方法在我的算法:

for (int i = 0; i < deck.length; i++) { 
    int j = (int)(Math.random() * deck.length); // Get a random index out of 52 
    int temp = deck[i]; // Swap the cards 
    deck[i] = deck[j]; 
    deck[j] = temp; 
} 

我有這裏的問題,然而,就是我有時可能會重複;結果,一些卡/值完全丟失。

我幾乎可以肯定,我沒有放棄我已經使用過的指數/數值,這可能是上述問題的核心。但我該怎麼辦呢?

有什麼建議嗎?可能的話,遵循我的思路。謝謝一堆!

screenshot 1

screenshot 2

+0

重複? j的重複值?我和j?什麼? –

+0

我隨機生成和/或已分配的副本 –

+0

您能向我們展示一個重複輸出的例子嗎?代碼中似乎沒有任何錯誤會產生重複。所以也許你對重複測試的方式是錯誤的。 –

回答

-1

請看看是否有所幫助:

boolean init[] = new boolean[52]; 
Random r = new Random(); 

int getNextCard(){ 
    int i = r.nextInt(52); 
    while(init[i]) 
     i = r.nextInt(52); 
    init[i] = true; 
    return i; 
} 

void shuffleCards() { 

    int[] deck = new int[52]; 
    for (int i = 0; i < deck.length; i++) { 
     deck[i] = getNextCard(); 
    } 
    System.out.println(Arrays.toString(deck)); 
} 

想法是使用一個Random生成0和52之間的隨機數。一旦一個數目,這我們將其標記爲布爾數組init。因此,下一次出現相同的數字時,我們再次生成隨機數,直到我們得到一個我們還沒有使用的數字。

+0

這不是洗牌,這是重新填充。 – Guy

+0

但是這會產生一個洗牌的權利? – Fayaz

+0

的確,順序是不同的。但這不是問題。 – Guy

2

只需使用一個新陣列用於混洗紙牌,並使用從先前陣列中移除的隨機卡片填充它。

import java.util.ArrayList; 

public class Test { 
    private static final int DECK_SIZE = 52; 

    public static void main(String args[]) { 
     ArrayList<Integer> deck = new ArrayList<Integer>(); 

     for (int i = 0; i < DECK_SIZE; ++i) { 
      deck.add(i); 
     } 

     ArrayList<Integer> shuffledDeck = new ArrayList<Integer>(); 

     while (deck.size() > 0) { 
      int index = (int) (Math.random() * deck.size()); 
      shuffledDeck.add(deck.remove(index)); 
     } 

     System.out.println(shuffledDeck.toString()); 
    } 
} 

或者只是使用Collections.shuffle():什麼

import java.util.ArrayList; 
import java.util.Collections; 

public class Test { 
    private static final int DECK_SIZE = 52; 

    public static void main(String args[]) { 
     ArrayList<Integer> deck = new ArrayList<Integer>(); 

     for (int i = 0; i < DECK_SIZE; ++i) { 
      deck.add(i); 
     } 

     Collections.shuffle(deck); 

     System.out.println(deck); 
    } 
} 
+0

謝謝你的幫助! –