我已经阅读了很多关于这个主题的内容,但我仍然对它有疑虑。 请帮助!
我制作了一副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;
}
然而,我在这里遇到的问题是,我有时可能会重复;结果,一些卡/值完全丢失。
我几乎可以肯定我并没有丢弃我已经使用的指数/值,这可能是上述问题的核心。但我该怎么做呢?
有什么建议吗?可能,遵循我同样的思路。非常感谢!
答案 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);
}
}