在for循环之前实例化和在for循环中实例化的区别

本文关键字:实例化 循环 for 区别 | 更新日期: 2023-09-27 18:03:22

所以我刚刚开始学习c#,我遇到了这个练习,滚动一个骰子N次,然后打印每边滚动的次数。然而,我得到了答案,我的问题在于在循环之前和循环中实例化一个Random数字对象。

我的代码是这样的(这是循环之前的实例化):

static void DiceRoll(int RollTimes)
    {
        int roll = 0;
        int counter1 = 0;
        int counter2 = 0;
        int counter3 = 0;
        int counter4 = 0;
        int counter5 = 0;
        int counter6 = 0;
        Random rnd = new Random();
        for (int ctr = 0; ctr < RollTimes; ctr++)
        {
            roll = 0;
            roll = (int)rnd.Next(1, 7);
            switch (roll)
            {
                case 1:
                    counter1++;
                    break;
                case 2:
                    counter2++;
                    break;
                case 3:
                    counter3++;
                    break;
                case 4:
                    counter4++;
                    break;
                case 5:
                    counter5++;
                    break;
                case 6:
                    counter6++;
                    break;
            }
        }
        Console.WriteLine("1 is rolled {0} times.", counter1);
        Console.WriteLine("2 is rolled {0} times.", counter2);
        Console.WriteLine("3 is rolled {0} times.", counter3);
        Console.WriteLine("4 is rolled {0} times.", counter4);
        Console.WriteLine("5 is rolled {0} times.", counter5);
        Console.WriteLine("6 is rolled {0} times.", counter6);
    }

,结果如下:

1 is rolled A times.
2 is rolled B times.
3 is rolled C times.
4 is rolled D times.
5 is rolled E times.
6 is rolled F times.

在我做对之前,实例化行(Random rnd = new Random();)在循环中。

for (int ctr = 0; ctr < RollTimes; ctr++)
        {
            roll = 0;
            roll = (int)rnd.Next(1, 7);
            Random rnd = new Random();
            // rest of the code

则结果(随机):

1 is rolled (N) times.
2 is rolled (N) times.
3 is rolled (N) times.
4 is rolled (N) times.
5 is rolled (N) times.
6 is rolled (N) times.

谁能解释或启发我为什么实例化的位置会改变结果?谢谢!

在for循环之前实例化和在for循环中实例化的区别

这个想法是,随机物体实际上并不是"随机的",老实说,现实中没有这样的事情,除了量子力学。好,回到你的问题,启发你的想法是,在幕后有一个系列(非常复杂的一个)对于给定的起始值(默认值为零)下一个值是计算机通过内部抓取下一个系列值。内部级数的复杂性让你觉得数值实际上是随机的。无论何时你用相同的种子实例化一个新的Random对象,你都将拥有相同的序列值。最好的模式是使用重载构造函数,该构造函数接受一个种子,并使用Datetime.Now.Ticks作为种子值,并尝试缓存随机对象。

所以答案是在循环之外创建一个实例,甚至更好地为每个实例使用不同的种子。