为什么随机范围每次给出相同的输出值?



这是我用来实现随机类

的代码
class Program
{
public static void Main()
{
for (int j = 0; j < 5; j++)
{ 
foreach (var item in GenerateRandomList(new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }))
Console.Write(item + " ");
Console.WriteLine(" ");
}
}
public static List<int> GenerateRandomList(List<int> arr)
{
var random = new Random(new Random().Next(1,10000));
var ls = new List<int>();
while(arr.Count>0)
{
var index = random.Next(0, arr.Count-1);
ls.Add(arr[index]);
arr.RemoveAt(index);
}
return ls;
}
}

下面是我得到的结果

first time
4 3 8 2 1 6 7 5 9 0
4 3 8 2 1 6 7 5 9 0
4 3 8 2 1 6 7 5 9 0
4 3 8 2 1 6 7 5 9 0
4 3 8 2 1 6 7 5 9 0
second time
6 3 4 2 8 5 9 1 7 0
6 3 4 2 8 5 9 1 7 0
6 3 4 2 8 5 9 1 7 0
6 3 4 2 8 5 9 1 7 0
6 3 4 2 8 5 9 1 7 0
third time 
9 2 4 8 1 6 3 5 7 0
9 2 4 8 1 6 3 5 7 0
9 2 4 8 1 6 3 5 7 0
9 2 4 8 1 6 3 5 7 0
7 1 3 6 5 2 8 9 4 0
and So on..

我错过了什么?有时它会给出不同的结果,但再次开始重复之前的结果。

new Random()创建一个新的随机数生成器实例,使用默认种子。

在。net框架中,默认的种子值与时间相关。在。net Core中,默认种子值是由线程静态伪随机数生成器生成的。从文档:

如果对不同的随机对象使用相同的种子,它们将生成相同的随机数序列。

如果默认种子是基于时间的,并且您快速连续创建了五个Random对象,则每个生成器将获得相同的种子(因为时间不精确,每个指令在不同的时间戳上执行),从而产生相同的伪随机数序列。

您只需要创建一次Random实例;例如,作为类字段。

最新更新