可能重复:
随机数生成器没有按照我计划的方式工作(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);
}
您应该将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);
}
Random
的实例需要实例化一次。
static Random random = new Random();
public static int RandomNumber(int min, int max)
{
return random.Next(min, max);
}
在您的实现中,random
在一个时间单位内与系统时钟进行了多次实例化,因此您在极少数迭代中使用了完全相同的种子值,这意味着对于单个调用,您将始终从Next
中获得相同的值。
将随机数置于RandomNumber之外,即
static Random random = new Random();
public static int RandomNumber(int min, int max)
{
return random.Next(min,max);
}