C#:随机数问题

时间:2010-12-24 05:29:28

标签: c# random

请参阅以下内容:

   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在每次迭代时都不同。我该怎么做?

6 个答案:

答案 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文章

Best way to seed Random() in singleton

答案 5 :(得分:0)

DateTime.Now.Ticks是Int64类型。如果你转换为int,它可能会转换为种子的相同值,因此给你相同的随机数。

创建后,无需重新设置或重新创建Random对象。只需重用该对象并获取下一个随机数。