可能重复:
Random number generator not working the way I had planned (C#)
我在c#中有这个代码,但我得到一个相同数字的结果,这有什么不对?
像p21,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 :(得分: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);
}
答案 1 :(得分:3)
Random
的实例需要实例化一次。
static Random random = new Random();
public static int RandomNumber(int min, int max)
{
return random.Next(min, max);
}
在您的实现中,random
在一个单位时间内使用系统时钟进行了几次实例化,因此您在极少数迭代中使用完全相同的种子值,这对于单个调用意味着您将始终从Next
获得相同的值。
答案 2 :(得分:0)
将Random放在RandomNumber之外,即
static Random random = new Random();
public static int RandomNumber(int min, int max)
{
return random.Next(min,max);
}