我已经阅读了很多关于该主题的内容,但我仍然对此心存疑虑。
请帮忙!
我创建了一副 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
只需为洗牌后的牌使用一个新数组,并使用从先前数组中移除的随机牌填充它。
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);
}
}