我已经启动了无线传感器网络模拟代码,但我不理解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);
}
答案 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的种子。
刻度线会不断变化,以便最大程度地减少再次生成相同序列的“随机”数字的可能性。