这个问题已经在这里有一个答案:
- 随机数发生器只有生成一个随机数 9回答
我有一个静态类的静态方法中下面的代码:
Random r = new Random();
int randomNumber = r.Next(1,100);
我有这样的一个循环中,我不断收到同样的randomNumber
!
这里有什么建议?
这个问题已经在这里有一个答案:
我有一个静态类的静态方法中下面的代码:
Random r = new Random();
int randomNumber = r.Next(1,100);
我有这样的一个循环中,我不断收到同样的randomNumber
!
这里有什么建议?
你不应该创建一个新的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);
一个好的种子一代对我来说是:
Random rand = new Random(Guid.NewGuid().GetHashCode());
这是非常随机的。 种子始终是不同的,因为种子也是随机生成的。
如果你因为某些原因,使用相同的Random
一遍又一遍,尝试的东西,时刻都在变化,就像时间本身对其进行初始化。
new Random(new System.DateTime().Millisecond).Next();
记住,这是不好的做法虽然。
编辑:默认的构造已经采用它的种子从时钟,也可能比我们会。 从MSDN引用:
随机():初始化随机类的新实例,使用一个依赖于时间的默认种子值。
下面的代码可能是你最好的选择:
new Random().Next();
有点晚,但是实现由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
public static Random rand = new Random(); // this happens once, and will be great at preventing duplicates
请注意,这是不被用于密码的目的。
这workes对我来说:
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);