[英]Java code stuck in infinitely repeating while loop
我有一些代碼通過將隨機選擇的卡從2D陣列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
2D數組的代碼。
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張卡開始,然后你就可以使用它們。 在這做同樣的事
雖然這只是線性操作,但您的解決方案是不確定的。
它不應該無限期地運行,除非你有一個不幸的一天或初始化卡陣列錯誤的值。
所以,這就是發生的事情。 由於你使用隨機猜測將卡片放入卡片組中,每次嘗試都會讓隨機發生器更難找到,也就是說,卡片還沒有放入卡片中。 在當天,您將有越來越多的嘗試正確地放置最后一張牌。 這些嘗試的次數可能達到數百甚至數千。
我在您的代碼中添加了幾行代碼,並在Ideone上顯示了問題。
ArrayList<String> deck = new ArrayList<String>();
HashMap<Integer, Integer> guesses = new HashMap<>();
for (int i = 0; i < 52; i++) {
int guess = 0;
int v = 0;
int s = 0;
Boolean notInDeck = false;
while (!notInDeck) {
v = rand.nextInt(13);
s = rand.nextInt(4);
guess++;
if (!deck.contains(cards[v][s])) {
notInDeck = true;
deck.add(cards[v][s]);
guesses.put(i, guess++);
}
}
}
for (Map.Entry<Integer, Integer> entry: guesses.entrySet()) {
System.out.printf("%2s : %s\n", entry.getKey(), entry.getValue());
}
如果您多次執行代碼,您將清楚地看到模式 - 最后猜測的數量會顯着增加。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.