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

时间:2015-02-02 22:25:10

标签: c# list unity3d

有人可以向我解释为什么这是一个无限循环?当我尝试这个时,团结就会挂起。我试图建立一副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--; }
            }
        }
    }

2 个答案:

答案 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

永远不会变错。

一般来说,你不应该以这种方式使用循环变量。它非常令人困惑,违反了最不可思议的原则。找到一种更好的方法来解决循环变量的问题。