我有一些代码通过将二维数组 cards
中随机选择的卡片分配到 ArrayList deck
中来洗牌,但是当我运行代码时它得到陷入无限循环。
一开始它工作正常,但似乎随机停止工作,几乎没有更改代码。
cards
是一个 13 x 4 的阵列,每个位置都有一张不同的卡片。
ArrayList<String> deck = new ArrayList<String>();
for (int i = 0; i < 52; i++) {
int v = 0;
int s = 0;
Boolean notInDeck = false;
while (!notInDeck) {
v = rand.nextInt(13);
s = rand.nextInt(4);
if (!deck.contains(cards[v][s])) {
notInDeck = true;
deck.add(cards[v][s]);
}
}
}
我尝试在不同点添加输出以尝试跟踪发生的事情
ArrayList<String> deck = new ArrayList<String>();
for (int i = 0; i < 52; i++) {
System.out.println("1");
int v = 0;
int s = 0;
Boolean notInDeck = false;
while (!notInDeck) {
System.out.println("2");
v = rand.nextInt(13);
s = rand.nextInt(4);
if (!deck.contains(cards[v][s])) {
System.out.println("3");
notInDeck = true;
deck.add(cards[v][s]);
}
System.out.println("4");
}
System.out.println("5");
}
System.out.println("6");
没有错误信息。
第一批遍历的输出是 1 2 3 4 5 1 2 3 4 5
,但最终无限重复 2 4 2 4 2 4
...
它应该像 1 2 3 4 5 1 2 3 4 5
然后有时 1 2 4 2 3 4 5
当它重复一组随机数时。
这是我的 cards
二维数组代码。
String[][] cards = new String[13][4];
String suit = " ";
String value = "";
for (int i = 0; i < 13; i++) {
for (int j = 0; j < 4; j++) {
if (j == 0) {
suit = "C";
} else if (j == 1) {
suit = "H";
} else if (j == 2) {
suit = "S";
} else if (j == 3) {
suit = "D";
}
if (i == 0) {
value = "A";
} else if (i == 10) {
value = "J";
} else if (i == 11) {
value = "Q";
} else if (i == 12) {
value = "K";
} else {
value = Integer.toString(i+1);
}
cards[i][j] = value;
}
}
编辑: 我意识到问题出在这一行
cards[i][j] = value;
应该是
cards[i][j] = value + " " + suit;
最佳答案
你正在让你的生活更加艰难。
在现实生活中,您不会拿到无数张卡片,也不会随机挑选卡片,直到您完成整副 52 张卡片。事实上,您从 52 张牌开始,然后将它们洗牌。在这里做同样的事情
- 收集 52 张卡片
- 随机播放该集合(例如使用 Collections.shuffle)
虽然这只是线性运算,但您的解决方案是不确定的。
关于Java 代码陷入无限重复的 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57208891/