如何种子随机类,避免了重复的随机值[复制]如何种子随机类,避免了重复的随机值[复制](How do

2019-05-08 17:16发布

这个问题已经在这里有一个答案:

  • 随机数发生器只有生成一个随机数 9回答

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

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

我有这样的一个循环中,我不断收到同样的randomNumber

这里有什么建议?

Answer 1:

你不应该创建一个新的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);


Answer 2:

一个好的种子一代对我来说是:

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

这是非常随机的。 种子始终是不同的,因为种子也是随机生成的。



Answer 3:

如果你因为某些原因,使用相同的Random一遍又一遍,尝试的东西,时刻都在变化,就像时间本身对其进行初始化。

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

记住,这是不好的做法虽然。

编辑:默认的构造已经采用它的种子从时钟,也可能比我们会。 从MSDN引用:

随机():初始化随机类的新实例,使用一个依赖于时间的默认种子值。

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

new Random().Next();


Answer 4:

有点晚,但是实现由System.Random使用的是Environment.TickCount

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

这避免了投DateTime.UtcNow.Ticks从一个长期的,这是有风险的反正,因为它并不代表自系统启动蜱,而是“自12点00分00秒午夜一月已经过去的100毫微秒间隔数1,0001(UTC 0:00:00于0001年1月1日,在公历)”。

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



Answer 5:

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

请注意,这是不被用于密码的目的。



Answer 6:

这workes对我来说:

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


Answer 7:

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

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

蜱虫会是唯一的投入诚信与可能是松散的价值将确定。



Answer 8:

我用这个在大多数情况下,保持种子是否有必要重复序列

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

要么

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


文章来源: How do I seed a random class to avoid getting duplicate random values [duplicate]
标签: c# random