请参阅以下内容:
for (int i=0; i<2; i++) {
// do some stuff
r = new Random((int)DateTime.Now.Ticks);
iRandom = r.Next(30000);
// do some other stuff
}
不要问我怎么做,但iRandom有时对于循环的两次迭代都是一样的。我需要iRandom在每次迭代时都不同。我该怎么做?
答案 0 :(得分:8)
将循环更改为:
r = new Random((int)DateTime.Now.Ticks);
for (int i=0; i<2; i++) {
// do some stuff
iRandom = r.Next(30000);
// do some other stuff
}
换句话说,将Random对象的创建放在循环之外。
答案 1 :(得分:2)
对于Math.Random与RNGCryptoServiceProvider相比的一些惊喜,请尝试绘制以下结果(例如,使用电子表格)。此代码将在LinqPad(www.LinqPad.net)中运行。值得一看:)
void Main()
{
{
var ds = Enumerable.Range(1, 30).Select(i => new Random(i).NextDouble());
ds.Dump();
}
{
var csp = new System.Security.Cryptography.RNGCryptoServiceProvider();
var bs = new byte[8 * 30];
var ds = new double[30];
csp.GetBytes(bs);
for (var i = 0; i < 30; i++)
{
var d = BitConverter.ToDouble(bs, i * 8);
while (d == 0D || Double.IsNaN(d))
{
var bytes = new byte[8];
csp.GetBytes(bytes);
d = BitConverter.ToDouble(bs, 0);
}
ds[i] = Math.Log10(Math.Abs(d));
}
ds.Dump();
}
}
答案 2 :(得分:2)
尝试使用非基于时间的种子创建Random,否则种子可能相同(并且随机数也相同)
for (int i = 0; i < 2; i++)
{
// do some stuff
r = new Random(Guid.NewGuid().GetHashCode());
iRandom = r.Next(30000);
// do some other stuff
}
答案 3 :(得分:1)
答案 4 :(得分:0)
尝试使用新的Guid进行播种,或者更好的是,使用Cryto提供程序...这是带有代码的Stko文章
答案 5 :(得分:0)
DateTime.Now.Ticks是Int64类型。如果你转换为int,它可能会转换为种子的相同值,因此给你相同的随机数。
创建后,无需重新设置或重新创建Random对象。只需重用该对象并获取下一个随机数。