我在静态类中的静态方法中有以下代码:
Random r = new Random();
int randomNumber = r.Next(1,100);
我在循环中有这个,我不断得到randomNumber
!
这里有什么建议吗?
答案 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使用的implementation是Environment.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);