有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

算法在Java中洗牌一副牌

关于这个话题,我读了很多东西,但我仍有疑虑。 求求你,救命

我制作了一副52张卡片:

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

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

我要用数学。我的算法中的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) 个答案

  1. # 1 楼答案

    只需为洗牌的牌使用一个新的阵列,并使用从先前阵列中移除的随机牌填充它

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