在C#中生成随机数,声明种子和最小间隔以及最大间隔

时间:2012-05-30 10:06:17

标签: c#

我已经定义了这样的方法:

private String getRadndomNumber(int min, int max) {
    Random rnd = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);
    return Convert.ToString(rnd.Next(min,max));
}

我正在定义种子和最小,最大间隔,我想知道SEED值是否对此有任何帮助?

tnx :)

2 个答案:

答案 0 :(得分:2)

种子价值是否有任何帮助取决于你想要做什么!

您使用DateTime.Now.Ticks & 0xFFFF作为种子,这意味着(i)您将种子基于当前时间,(ii)你将这个种子限制在0到65535之间的值。一般来说,这些都不是特别好的主意。系统时钟的粒度大约为15ms(iirc),因此在相同的15ms“段”内对方法的任何调用都将导致使用相同的种子。

如果您没有将显式种子传递给Random构造函数,那么它会有效地使用Environment.TickCount & 0x7FFFFFFF作为种子。因此它仍将基于当前时间,但它将比您的自定义种子具有更宽的范围:0到2147483647。

来自documentation for the Random(Int32) constructor ...

  

为不同的Random对象提供相同的种子值   每个实例产生相同的随机数序列。

来自documentation for the Random() constructor ...

  

默认种子值是从系统时钟派生而来的   有限分辨率。结果,不同的Random对象   通过调用默认构造函数将紧密连续创建   具有相同的默认种子值,因此将产生   相同的随机数集。使用可以避免此问题   单个Random对象生成所有随机数。

答案 1 :(得分:1)

Seed帮助您生成随机数,它是用于随机算法的基数。每次使用相同的种子最终会得到一组可预测的“随机”数字。

来自MS文档:

  

“如果您的应用需要不同的随机数序列,   使用不同的种子值重复调用此构造函数。单程   产生独特的种子价值是为了使其与时间有关。对于   例如,从系统时钟导出种子值。然而   系统时钟可能没有足够的分辨率来提供不同的   使用不同的种子值调用此构造函数。“

默认构造函数使用系统时钟作为种子,但在同一个tick中创建的多个实例可能会在生成器之间产生可预测的数字。