我已经定义了这样的方法:
private String getRadndomNumber(int min, int max) {
Random rnd = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);
return Convert.ToString(rnd.Next(min,max));
}
我正在定义种子和 min,max 间隔,我想知道 SEED 值在这里是否有帮助?
tnx :)
我已经定义了这样的方法:
private String getRadndomNumber(int min, int max) {
Random rnd = new Random((int) DateTime.Now.Ticks & 0x0000FFFF);
return Convert.ToString(rnd.Next(min,max));
}
我正在定义种子和 min,max 间隔,我想知道 SEED 值在这里是否有帮助?
tnx :)
种子值是否有帮助取决于您要做什么!
您正在使用DateTime.Now.Ticks & 0xFFFF
作为种子,这意味着(i)您将种子基于当前时间,并且(ii)您将种子限制为 0 到 65535 之间的值。通常,这些都不是特别好主意。系统时钟的粒度约为 15 毫秒(iirc),因此在相同的 15 毫秒“段”内对您的方法的任何调用都将导致使用相同的种子。
如果您没有将显式种子传递给Random
构造函数,那么它会有效地Environment.TickCount & 0x7FFFFFFF
用作种子。所以它仍将基于当前时间,但它的范围比您的自定义种子要宽得多:0 到 2147483647。
为不同的
Random
对象提供相同的种子值会导致每个实例产生相同的随机数序列。
从构造函数的文档Random()
...
默认种子值来自系统时钟并且具有有限的分辨率。因此,
Random
通过调用默认构造函数连续创建的不同对象将具有相同的默认种子值,因此将产生相同的随机数集。这个问题可以通过使用单个Random
对象生成所有随机数来避免。
Seed 可以帮助您生成一个随机数,它是用于他们的随机算法的基数。每次使用相同的种子可能会导致一组可预测的“随机”数字按顺序出现。
从 MS 文档:
“如果您的应用程序需要不同的随机数序列,请使用不同的种子值重复调用此构造函数。产生唯一种子值的一种方法是使其与时间相关。例如,从系统时钟派生种子值。但是,系统时钟可能没有足够的分辨率来为这个构造函数的不同调用提供不同的种子值。”
默认构造函数使用系统时钟作为种子,但在同一滴答中创建的多个实例可能会导致生成器之间出现可预测的数字。