C# WindowsFormsApplication C发生了奇怪的事情

C# WindowsFormsApplication C发生了奇怪的事情,c#,winforms,C#,Winforms,我制作了一个简单的WindowsFormsApplication,但我遇到了一些困难。在表单中,我有10个文本框和一个按钮。该程序的目的是在我单击按钮时在每个框中生成不同的数字。以下是代码的一部分: private void button1_Click(object sender, EventArgs e) { int p = 0; int[] array = GeneratingArray(); foreach (Control c i

我制作了一个简单的WindowsFormsApplication,但我遇到了一些困难。在表单中,我有10个文本框和一个按钮。该程序的目的是在我单击按钮时在每个框中生成不同的数字。以下是代码的一部分:

private void button1_Click(object sender, EventArgs e)
    {
        int p = 0;
        int[] array = GeneratingArray();

        foreach (Control c in tableLayoutPanel1.Controls)
        {
            if (c.GetType().ToString() == "System.Windows.Forms.TextBox")
            {
                c.Text = array[p].ToString();
                p++;
            }
        }
    }

    public int GeneratingInt()
    {
        int random;
        Contract.Ensures(Contract.Result<int>() > -11, "Array out of Bounds(-10 ; 10)");
        Contract.Ensures(Contract.Result<int>() < 11, "Array out of Bounds(-10 ; 10)");
        Random gnr = new Random();
        random = gnr.Next(20);
        return random;
    }

    public int[] GeneratingArray()
    {
        int[] array = new int[10];
        int random;
        for (int i = 0; i < 10; i++)
        {
            random = GeneratingInt();
            array[i] = random;
        }

        return array;
    }

问题是,当我使用调试器时,所有的调试器都可以正常工作,但当我启动应用程序时,所有的框都会生成相同的数字。我找不到导致这种问题的原因,所以我问你。谢谢。

问题是您的应用程序运行速度太快

通过为GeneratingInt的每个调用创建一个新的Random实例,您正在使用当前时间播种Random。在紧密循环中运行时,这会导致随机生成器每次都提供相同的数字


将随机变量移动到类级变量,构造一次,然后重用同一个实例。这将导致它按照您希望的方式运行。

问题是您的应用程序运行速度太快

通过为GeneratingInt的每个调用创建一个新的Random实例,您正在使用当前时间播种Random。在紧密循环中运行时,这会导致随机生成器每次都提供相同的数字


将随机变量移动到类级变量,构造一次,然后重用同一个实例。这将导致它按照您希望的方式运行。

或者他可能很固执,将DateTime.Now.Ticks作为随机构造函数参数中的种子传递:这不是一个好主意。非常感谢。这就是问题所在。@Nyuno你可能会遇到同样的问题。默认构造函数使用Environment.TickCount,但在XP上,例如,它可以具有与DateTime.Now.Ticks相同的精度。有关详细信息,请参阅这个伟大的答案:这确实是一个伟大的答案。非常感谢。或者他可能很固执,将DateTime.Now.Ticks作为种子传递给随机构造函数参数:这不是一个好主意。非常感谢。这就是问题所在。@Nyuno你可能会遇到同样的问题。默认构造函数使用Environment.TickCount,但在XP上,例如,它可以具有与DateTime.Now.Ticks相同的精度。有关详细信息,请参阅这个伟大的答案:这确实是一个伟大的答案。非常感谢。