簡體   English   中英

Java代碼陷入無限重復的while循環中

[英]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張卡開始,然后你就可以使用它們。 在這做同樣的事

  1. 創建52張卡的集合
  2. 隨機收集該集合(例如,使用Collections.shuffle)

雖然這只是線性操作,但您的解決方案是不確定的。

它不應該無限期地運行,除非你有一個不幸的一天或初始化卡陣列錯誤的值。

所以,這就是發生的事情。 由於你使用隨機猜測將卡片放入卡片組中,每次嘗試都會讓隨機發生器更難找到,也就是說,卡片還沒有放入卡片中。 在當天,您將有越來越多的嘗試正確地放置最后一張牌。 這些嘗試的次數可能達到數百甚至數千。

我在您的代碼中添加了幾行代碼,並在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM