2012-12-15 51 views
1

我做了一个简单的WindowsFormsApplication,但我遇到了一些困难。在表单中我有10个文本框和一个按钮。该程序的目的是在单击按钮时在每个框中生成不同的编号。下面是从代码的一部分:奇怪的事情发生在WindowsFormsApplication C#

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; 
    } 

的问题是,当我使用调试器都工作正常,但是当我开始在所有的盒子应用程序产生相同的号码。我找不到是什么原因导致这种问题,所以我问你。谢谢。

回答

6

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

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

将您的Random移动到一个级别变量中,构造一次,并且重用相同的实例。这会导致它按照你的意愿行事。

+0

或者他可以固执并将DateTime.Now.Ticks作为Random构造函数参数中的种子传递:)不是一个好主意。 – Nyuno

+0

非常感谢。这是问题所在。 –

+1

@Nyuno你可能会遇到同样的问题。默认构造函数使用Environment.TickCount,但在XP上,它可以具有与DateTime.Now.Ticks相同的精度。有关详细信息,请参阅此优秀答案:http://stackoverflow.com/a/8865560/65358 –