在Java中随机播放一副纸牌

时间:2016-09-18 12:37:25

标签: java algorithm duplicates shuffle

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

我制作了一副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

1 个答案:

答案 0 :(得分:4)

只需为洗牌使用新阵列,然后使用从先前阵列中删除的随机卡填充它。

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);
    }
}