我已经定义了这样的方法:
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 :)
答案 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中创建的多个实例可能会在生成器之间产生可预测的数字。