我如何种一个随机类,以避免重复的随机值

我有一个静态类中的静态方法内的以下代码:

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

我有这个循环内,我不断得到相同的randomNumber

这里有什么build议?

你不应该在循环中创build一个新的Random实例。 尝试像这样:

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

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

为了完整起见,如果您确实需要重新生成Random ,您将使用新种子创build一个新的Random实例:

 rnd = new Random(newSeed); 

对我来说好的一代是:

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

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

如果你因为某种原因不能一次又一次地使用相同的Random ,那就试着用随时间变化的东西来初始化它,比如时间本身。

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

请记住,这是不好的做法。

编辑:默认的构造函数已经采取从时钟的种子,可能比我们会更好。 从MSDN引用:

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

下面的代码可能是你最好的select:

 new Random().Next(); 

位晚了,但System.Random使用的实现是Environment.TickCount

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

这样就避免了必须从一个longtypes转换DateTime.UtcNow.Ticks ,因为它不代表系统启动以来的刻度,所以这样做有风险,但是“从1月中旬12:00:00开始已经过去了100纳秒的时间间隔1, 0001(0001年1月1日0时00分00秒,格里历)“。

正在为TestApi的StringFactory.GenerateRandomString寻找一个好的整数种子

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

请注意,这不是用于encryption的目的。

这为我工作:

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

一个好的种子初始化可以这样完成

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

蜱将是独一无二的,并将其转换成一个整数,可能是一个松散的价值将是确定的。

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

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

要么

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