【发布时间】:2015-02-02 22:25:10
【问题描述】:
有人可以向我解释为什么这是一个无限循环吗?当我尝试这个时,团结就会挂起。我正在尝试构建一副 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--; }
}
}
}
【问题讨论】:
-
如果您的问题不是这样,请不要写“我如何[做这件事]”之类的标题。
-
另外,你的方法确实效率低下。不要随意加卡;您已经知道一副纸牌应该包含什么(每张纸牌)。只需创建一个正常的有序牌组,然后使用一种方法对其进行洗牌。 stackoverflow.com/questions/273313/randomize-a-listt-in-c-sharp
-
当您考虑当列表快满时会发生什么时,您可以看到这种随机化方法是多么可怕。当一副牌中有 51 张牌时,您知道最后一张牌是什么,但您仍继续尝试随机生成它。这种方法非常非常糟糕,在任何情况下都不应该使用它。如果您想要随机播放,请使用随机播放算法。
-
这里的另一个重要点是,即使您修复了错误,您也是在使用 32 位种子来洗牌 52 张牌。这意味着有 2^32 个可能的洗牌,但有 52 个!可能的真正纸牌。您永远无法生成数以万亿计的可能套牌。使用加密强度的随机性来源来洗牌。
-
@Sahuagin:正确;
Random名称错误。它是一个伪随机数生成器;如果您知道种子,那么序列是完全可预测的,根本不是“随机的”。由于只有 ~10^9 个种子,因此只有 ~10^9 个可能的数字序列,因此只有 ~10^9 个可能的不同牌组生成。但现实生活中有大约 10^67 种可能的套牌;这个算法只得到它们的一小部分。如果玩这个游戏是为了钱,这可能很重要。