我如何种一个随机类,以避免重复的随机值
我有一个静态类中的静态方法内的以下代码:
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);