为什么“new Random()。Next()”不返回像“random.Next()”这样的随机数?

时间:2014-07-03 07:08:09

标签: c# random

我尝试了两种不同的方法来获得一系列随机数:

// (a) works
Random random = new Random();
return Enumerable.Range(0, 20).OrderBy(n => random.Next());

// (b) does not work
return Enumerable.Range(0, 20).OrderBy(n => new Random().Next());

我正在使用random.Next()的第一个变体工作正常。

但我调用new Random().Next()的变体不会返回随机数;相反,它返回一个从0到20的数字序列。

现在我的问题是:

  • 什么术语表示C#中对象new Random().Next()的第二种初始化?
  • 它与第一个有什么不同,所以我没有得到欲望输出?

1 个答案:

答案 0 :(得分:6)

随机类在构造时使用种子初始化 - 此种子将用于生成唯一的数字序列。如果未指定种子,则Environment.TickCount用作种子。在您的情况下,序列构造得如此之快,以至于Random类在每个构造的实例中都获得相同的种子。所以所有项都返回相同的值,而不是随机排序。

另一方面,第一个工作行为每个可枚举项都有单个Random类实例。因此,调用.Next()会产生下一个随机数,尽管种子是相同的,并且序列会随机排序。

说到生成没有重复的随机序列 - 请查看Fisher-Yates shuffle。使用Random()的示例有副作用 - 执行每个循环迭代会更改Random()类实例的内部状态,这会导致不期望的行为 - 例如,如果排序算法依赖于每个序列项在排序期间返回相同的数字的事实(这不是.net的情况,但谁知道 - 未来内部实施可能会改变。