有人可以向我解释为什么这是一个无限循环?当我尝试这个时,团结就会挂起。我试图建立一副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--; }
}
}
}
答案 0 :(得分:6)
您正在紧密循环中重新创建Random
。每次使用相同的种子值,因此每次都会生成相同的卡。如果卡片已经存在于套牌中,你就会减少你的循环变量,它会永久地旋转#34;。实际上,如果种子最终改变了,你就可以了。
您的代码应为:
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
的最大值为独占。
答案 1 :(得分:2)
因为您正在循环中更改循环变量。
} else { i--; }
所以终止条件
i<52
永远不会变错。
一般来说,你不应该以这种方式使用循环变量。它非常令人困惑,违反了最不可思议的原则。找到一种更好的方法来解决循环变量的问题。