如何播种随机类以避免获得重复的随机值

时间:2009-11-23 20:31:58

标签: c# random

我在静态类中的静态方法中有以下代码:

Random r = new Random();
int randomNumber = r.Next(1,100);

我在循环中有这个,我不断得到randomNumber

这里有什么建议吗?

8 个答案:

答案 0 :(得分:287)

对我而言,良好的种子生成是:

Random rand = new Random(Guid.NewGuid().GetHashCode());

这是随机的。种子总是不同的,因为种子也是随机生成的。

答案 1 :(得分:97)

您不应该在循环中创建新的Random实例。尝试类似:

var rnd = new Random();
for(int i = 0; i < 100; ++i) 
   Console.WriteLine(rnd.Next(1, 100));

单个Random实例生成的随机数序列应该是均匀分布的。通过快速连续为每个随机数创建一个新的Random实例,您可能会使用相同的值为它们播种,并让它们生成相同的随机数。当然,在这种情况下,生成的序列将远离均匀分布。

为了完整起见,如果您确实需要重新设定Random,则会使用新种子创建Random的新实例:

rnd = new Random(newSeed);

答案 2 :(得分:15)

如果由于某些原因你不能一次又一次使用相同的Random,请尝试使用一直在变化的内容进行初始化,例如时间本身。

new Random(new System.DateTime().Millisecond).Next();

记住这是不好的做法。

编辑:默认构造函数已经从时钟中获取其种子,并且可能比我们更好。引自MSDN:

  

Random():使用与时间相关的默认种子值初始化Random类的新实例。

以下代码可能是您的最佳选择:

new Random().Next();

答案 3 :(得分:15)

迟到了,但System.Random使用的implementationEnvironment.TickCount

public Random() 
  : this(Environment.TickCount) {
}

这避免了必须从长时间转换DateTime.UtcNow.Ticks,这无论如何都是有风险的,因为它不代表自系统启动以来的滴答,而是“自12:00:00以来经过的100纳秒间隔的数量0001年1月1日午夜(公元1月1日0:00:00,公历)“。

正在为TestApi的StringFactory.GenerateRandomString

寻找一个好的整数种子

答案 4 :(得分:3)

public static Random rand = new Random(); // this happens once, and will be great at preventing duplicates

请注意,这不得用于加密目的。

答案 5 :(得分:3)

这对我有用:

private int GetaRandom()
    {
        Thread.Sleep(1);
        return new Random(DateTime.Now.Millisecond).Next();
    }

答案 6 :(得分:0)

可以像这样进行良好的种子初始化

Random rnd = new Random((int)DateTime.Now.Ticks);

刻度线将是唯一的,并且转换为可能具有松散值的int将是正常的。

答案 7 :(得分:-2)

我在大多数情况下使用它,如果需要重复序列,请保留种子

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

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