使用System.DateTime.Now.Ticks获取种子值

时间:2016-01-24 19:18:48

标签: c# seed

我已经启动了无线传感器网络模拟代码,但我不理解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 (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);
}

3 个答案:

答案 0 :(得分:3)

DateTime.Now.Ticks返回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

因此,为了创建一个随机实例more random,可以使用一个不太可能可预测的值,在您的情况下,DateTime实例上的刻度数例如,

var random = new Random((int)DateTime.UtcNow.Ticks);

或更好的方法是:

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

答案 1 :(得分:1)

$(function () { $("#click-me").click(function (e) { e.preventDefault(); document.getElementById('list').style.backgroundColor = "red"; }); }); 类是pseudorandom number generator

  

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

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

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

但是,您不必提供自己的“随机”种子。如果您使用default constructor构建Random实例,则算法将以Environment.TickCount播种,每次执行时很可能会有所不同。

此外,Random是一项相对昂贵的操作,必须考虑本地时区来计算当前本地时间。这可能与您的代码无关,但一般情况下我强烈建议您使用DateTime.Now,并且只在需要之前进行任何时区转换。在你的情况下,你根本不关心时区。

答案 2 :(得分:0)

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

刻度线会不断变化,以便最大程度地减少再次生成相同序列的“随机”数字的可能性。