C# 为什么要用unchecked(Environment.TickCount*31)初始化一个新的Random()?

C# 为什么要用unchecked(Environment.TickCount*31)初始化一个新的Random()?,c#,random,C#,Random,我发现了一个随机实例的初始化: var random = new Random(unchecked(Environment.TickCount * 31)); 为什么不简单地使用new Random()?关键字unchecked可以防止在计算Environment.TickCount*31整数溢出时引发异常 结果计算本质上是一个随机整数(它丢弃了一堆高阶位),用于为随机数生成器种子 请注意,将此代码作为其无参数构造函数: public Random() : this(Environm

我发现了一个
随机
实例的初始化:

var random = new Random(unchecked(Environment.TickCount * 31));

为什么不简单地使用
new Random()

关键字
unchecked
可以防止在计算
Environment.TickCount*31
整数溢出时引发异常

结果计算本质上是一个随机整数(它丢弃了一堆高阶位),用于为随机数生成器种子

请注意,将此代码作为其无参数构造函数:

public Random() 
    : this(Environment.TickCount) {
  }

Random
在相关的勾号计数方面存在一些统计问题。我想31号应该能解决这个问题。此代码在任何情况下都会被破坏,因为它依赖于记号。更好而不是最好的方法是
newrandom(NewGuid().GetHashCode())
。这是一段完全无用的代码
Random()
已经基于
环境对自身进行了初始化。TickCount
,默认情况下,C#未选中。我真的很想知道添加
*31
有什么作用。为什么是31?这样的“神奇数字”?因为我在很多地方都看到了。我不知道。这可能是个错误。使用2作为一个大的梅森素数;也许这就是它的来源。31==2^5-1==11111(二进制)。与这样一个数字相乘意味着分散差异:即使两个数字仅在一位上不同,这两个数字分别与31相乘也很可能在多个位上不同。但是,对于
随机
功能的正确种子植入实现,这应该不是必需的。