2012-01-27 79 views
0

可能重复:
Random number generator not working the way I had planned (C#)写入文件的随机数C#

我在C#中的代码,但我得到的结果相同的号码,有什么错?

像A21,A21,A21 ....

 String c = ""; 
     int randomNumber = 0; 
     for (int i = 0; i < 20; i++) 
     { 
      randomNumber = RandomNumber(0, 617); 
      c += "a " + randomNumber + ", ";      
     } 
     file.WriteLine(c); 



I am using this function 

public static int RandomNumber(int min, int max) 
    { 
     Random random = new Random(); 
     return random.Next(min, max); 
    } 
+0

是种子在c#不必要? – clime 2012-01-27 22:07:29

+4

默认种子是默认构造函数中的当前时间 - 由于当前循环之间的时间非常快,它们都具有相同的种子。 – 2012-01-27 22:08:15

+0

我怎么能生成20个不同的随机数字? – cMinor 2012-01-27 22:21:36

回答

7

您应该通过Random作为参数传递给你的函数。尽管你的功能已经没有附加值了。

var rnd = new Random(); 
for (int i = 0; i < 20; i++) 
{ 
    randomNumber = RandomNumber(rnd ,0, 617); 
    c += "a " + randomNumber + ", ";      
} 

public static int RandomNumber(Random rnd, int min, int max) 
{ 
    return rnd.Next(min, max); 
} 

它使用的是时钟初始化你做new Random()每次。这意味着在一个紧密的循环中,您可以获得相同的价值。您应该保留一个单个的Random实例,并在同一个实例上继续使用Next。

https://stackoverflow.com/a/768001/284240

编辑:我读了您要在给定范围内创建20倍独特的数字您的评论,这里是使用HashSet<int>一个办法:

HashSet<int> uniqueNumber = new HashSet<int>(); 
var rnd = new Random(); 
while(uniqueNumber.Count<20){ 
    var nextNum = rnd.Next(0, 617); 
    uniqueNumber.Add(nextNum); 
} 
3

Random需求实例被实例化一次。

static Random random = new Random(); 
public static int RandomNumber(int min, int max) 
{   
    return random.Next(min, max); 
} 

在您的实现,random渐渐实例与系统时钟多次为一个时间单位让你在使用完全相同的种子值极少数迭代,这对于单个呼叫意味着你将总是从Next获得相同的值。

0

将RandomNumber的随机外即

static Random random = new Random(); 
public static int RandomNumber(int min, int max) 
{ 
    return random.Next(min,max); 
}