有人可以向我解释为什么这是一个无限循环吗?

Can someone please explain to me why this is an infinite loop?

有人可以向我解释为什么这是一个无限循环吗?当我尝试这个时,统一就会挂起。我正在尝试构建一副 52 张牌

    public class Deck {
        private List<Card> deckList = new List<Card>();

        public Deck() {
            for (int i = 0; i<52; i++) {
                System.Random rnd = new System.Random();
                Card newCard = new Card(rnd.Next(1,13), rnd.Next(1,4));
                if (!deckList.Contains(newCard) || i == 0) {
                    deckList.Add(newCard);
                } else { i--; }
            }
        }
    }

因为您正在更改循环内的循环变量。

} else { i--; }

所以终止条件

i<52

永远不会变成假。

一般来说,您不应该以这种方式随意使用循环变量。这非常令人困惑,并且违反了最少惊喜原则。找到一种更好的方法来做到这一点,而不涉及弄乱循环变量。

您正在重新创建 Random 在您的紧密循环中。这每次都使用相同的种子值,因此您每次都生成相同的 card。由于如果卡牌已经存在于牌组中,则减少循环变量,因此它会旋转 "forever"。事实上,如果种子最终改变了,你就没事了。

您的代码应该是:

       System.Random rnd = new System.Random();
       for (int i = 0; i<52; i++) {
            Card newCard = new Card(rnd.Next(1,14), rnd.Next(1,5));
            if (!deckList.Contains(newCard) || i == 0) {
                deckList.Add(newCard);
            } else { i--; }
        }

请注意,这是一个非常 奇怪的循环。我会使用一个 while 循环来检查是否还有剩余的卡片之类的。无论如何,不​​要在这样的紧密循环中实例化 Random

更好的是,只需创建所有卡片并shuffle它们。

我错过了评论中提到的另一个更改,您需要使用 rnd.Next(1,14)rnd.Next(1,5) 以便实际生成每张卡片。否则没有出路。请记住,rnd.Next 的最大值是 exclusive