2014-11-09 72 views
0
for (int i = 1; i <= 55; i++) 
{ 
    System.Random myRandom = new System.Random(); 
    //int myInt; 3 lines just alternate method 
    //myInt = myRandom.Next(); 
    //System.Console.WriteLine(myInt); 
    System.Console.WriteLine(myRandom.Next()); 
    Thread.Sleep(15); // if less, trouble 
} 

我一直得到同一个数字的倍数,一次达到20个,而不是每个连续的数字不同。出于某种原因,我添加了sleep语句,并且它的值在15或更大时有效。事实上,如果你增加睡眠参数值,你可以'选择'你得到多少个连续的重复数字。设置一个范围没有区别。循环比随机数发生器更快吗?这并不严重,我正在通过“Essential C#5.0”这本书。我查看了至少50个“随机”问题,但没有一个涉及这个现象。三条注释行是做同样事情的不同方式,我没有在同一个版本中执行。C#System.Random需要睡眠才能工作

+2

原因是你每次都创建一个新的Random实例。看到这个问题的细节:[随机数发生器只生成一个随机数](http://stackoverflow.com/questions/767999/random-number-generator-only-generating-one-random-number) – 2014-11-09 06:00:29

回答

1

问题就出在这行:

System.Random myRandom = new System.Random(); 

这应该是对环外。为什么?因为它会根据时间信息生成一个随机种子,并且随着您一个接一个地创建它们,它们会得到相同的种子。当线程在迭代之间进入休眠状态时,时间会发生变化,以便下一个Random获取不同的种子值。

试试这个:

System.Random myRandom = new System.Random(); 
for(int i = 1; i <= 55; i++) 
{ 
    // Here be the rest of the code 
} 

现在,创建Random对象只有一次,获取其种子值只有一次。