有人可以向我解释为什么这是一个无限循环吗?
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。
有人可以向我解释为什么这是一个无限循环吗?当我尝试这个时,统一就会挂起。我正在尝试构建一副 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。