用 Java 洗一副纸牌

1 java algorithm shuffle duplicates

我已经阅读了很多关于这个主题的内容,但我仍然对此有疑虑。请帮忙!

我创建了一副 52 张牌:

int[] deck = new int[52]; 
for (int i = 0; i < deck.length; i++) {deck[i] = i;}
Run Code Online (Sandbox Code Playgroud)

现在,我想正确洗牌,而不是遵循任何模式或功能。

我将在我的算法中使用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;
}
Run Code Online (Sandbox Code Playgroud)

然而,我在这里遇到的问题是我有时可能会得到重复;结果,一些卡片/值完全丢失。

我几乎可以肯定我没有丢弃我已经使用过的索引/值,这可能是上述问题的核心。但是我该怎么做呢?

有什么建议?可能,按照我的思路。谢谢一堆!

截图 1

截图 2

fel*_*cho 5

只需为洗牌的卡片使用一个新数组,并使用从先前数组中删除的随机卡片填充它。

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

或者只是使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)