C# 使用System.DateTime.Now.Ticks作为种子值

C# 使用System.DateTime.Now.Ticks作为种子值,c#,seed,C#,Seed,我已经开始编写一个无线传感器网络模拟代码,但我不理解种子的含义,也不理解下面方法中System.DateTime.Now.Ticks的返回值 public void Reset(bool bNewSeed) { // this function resets the network so that a new simulation can be run - can either be reset with a new seed, or with the previous seed (fo

我已经开始编写一个无线传感器网络模拟代码,但我不理解
种子的含义,也不理解下面方法中
System.DateTime.Now.Ticks
的返回值

public void Reset(bool bNewSeed) {
    // this function resets the network so that a new simulation can be run - can either be reset with a new seed, or with the previous seed (for replay.)
    this.iProcessTime = 0;
    this.iPacketsDelivered = 0;
    foreach (WirelessSensor sensor in aSensors) {
        sensor.iResidualEnergy = sensor.iInitialEnergy;
        sensor.aPackets = new ArrayList();
        sensor.iSensorRadius = iSensorRadius;
        sensor.iSensorDelay = 0;
        foreach (WirelessSensorConnection connection in sensor.aConnections) {
            connection.iTransmitting = 0;
            connection.packet = null;
        }
    }
    aRadar = new ArrayList();
    if (bDirectedRouting == true)
        SetRoutingInformation();
    iLastUpdated = iUpdateDelay;
    if (bNewSeed == true)
        this.iSeed = (int) System.DateTime.Now.Ticks;
    r = new Random(iSeed);
}

创建一个简单的控制台应用程序,使用随机对象在控制台上打印一些数字。创建没有种子值的随机对象。现在启动程序10次,观察生成的数字;) 然后给它一个常量种子值,如123,然后再次观察。 然后给它一个DateTime.Now.Ticks的种子


滴答声是一种不断变化的声音,因此您可以将再次生成相同“随机”数字序列的可能性降至最低。

DateTime。现在。滴答声
返回一个表示该实例中滴答声数量的
long

通过向
Random
的实例提供种子值,可以指定用于计算伪随机数序列起始值的数字

因此,如果两个
Random
实例都具有相同的种子,它们将生成相同的值,例如:

var randomOne = new Random(1);
var randomTwo = new Random(1);

var valOne = randomOne.Next(1, 1000);
var valTwo = randomTwo.Next(1, 1000);

valOne.Equals(valTwo); // True
因此,为了使一个随机实例
更随机
可以使用一个不太可能预测的值,在您的情况下,
DateTime
实例上的刻度数

var random = new Random((int)DateTime.UtcNow.Ticks);
或者更好的方法是:

var random = new Random(Guid.NewGuid().GetHashCode());

Random
类是一个

[这]是一种生成数字序列的算法,其属性与随机数序列的属性近似。PRNG生成的序列不是真正的随机序列,因为它完全由一组相对较小的初始值(称为PRNG的种子)决定

如果使用创建
Random
实例,将始终获得相同的随机数序列。这可能非常有用,因为它允许您对需要随机数的计算进行确定性模拟

但是,您通常希望在每次执行代码时使用不同的随机数。这就是代码使用依赖于当前时间的种子的原因。
bNewSeed
变量的目的是使
Random
实例保持一个已知种子,允许使用相同的数字序列重新运行模拟,或者使用“Random”种子创建一个新的
Random
实例。结果将是一个新的模拟

但是,您不必提供自己的“随机”种子。如果您使用构建了一个
随机
实例,那么该算法将被播种,在每次执行时很可能会有所不同


另外,
DateTime.Now
是一个相对昂贵的操作,必须考虑本地时区才能计算当前本地时间。这在您的代码中可能并不重要,但总体而言,我强烈建议使用
DateTime.UtcNow
,并且只在需要之前进行时区转换。在您的情况下,您根本不关心时区。

如果您不为伪随机数生成器种子,它从创建开始每次都会生成相同的数字序列。对于测试来说很实用,但对于生产代码,您需要一些唯一的种子,并且从System.DateTime.Now获得的滴答数是一个合理的候选值,除非您快速连续创建新的随机生成器。@najlaa E.I提供不同的种子(因为
System.DateTime.Now.Ticks
在每次访问时返回不同的数字)将确保从
Random
object获取不相同的序列为什么使用
Guid.NewGuid().GetHashCode()是更好的方法?请激励。