我在静态类中的静态方法中有以下代码:
Random r = new Random();
int randomNumber = r.Next(1,100);
Run Code Online (Sandbox Code Playgroud)
我在循环中有这个,我一直都这样randomNumber!
这里有什么建议?
jop*_*aus 305
一个好的种子一代对我来说是:
Random rand = new Random(Guid.NewGuid().GetHashCode());
Run Code Online (Sandbox Code Playgroud)
这是非常随机的.种子总是不同的,因为种子也是随机产生的.
Meh*_*ari 99
您不应该Random在循环中创建新实例.尝试类似的东西:
var rnd = new Random();
for(int i = 0; i < 100; ++i)
Console.WriteLine(rnd.Next(1, 100));
Run Code Online (Sandbox Code Playgroud)
由单个Random实例生成的随机数序列应该是均匀分布的.通过Random快速连续为每个随机数创建一个新实例,您可能会使用相同的值为它们播种,并使它们生成相同的随机数.当然,在这种情况下,生成的序列将远离均匀分布.
为了完整起见,如果你真的需要重新设置a Random,你将Random使用新种子创建一个新实例:
rnd = new Random(newSeed);
Run Code Online (Sandbox Code Playgroud)
Orp*_*hid 19
稍晚,但System.Random使用的实现是Environment.TickCount:
public Random()
: this(Environment.TickCount) {
}
Run Code Online (Sandbox Code Playgroud)
这避免了必须DateTime.UtcNow.Ticks从长时间投射,这无论如何都是有风险的,因为它不表示自系统启动以来的刻度,而是"自从0001年1月1日午夜12:00:00起经过的100纳秒间隔的数量(0 :00:00 UTC,1月1日,在公历中,"格里高利历
正在为TestApi寻找一个好的整数种子 StringFactory.GenerateRandomString
PPC*_*PPC 16
如果由于某种原因你不能Random一次又一次地使用它,尝试用一直在变化的东西来初始化它,比如时间本身.
new Random(new System.DateTime().Millisecond).Next();
Run Code Online (Sandbox Code Playgroud)
记住这是不好的做法.
编辑:默认构造函数已经从时钟中获取其种子,并且可能比我们更好.引自MSDN:
Random():使用与时间相关的默认种子值初始化Random类的新实例.
下面的代码可能是您的最佳选择:
new Random().Next();
Run Code Online (Sandbox Code Playgroud)
public static Random rand = new Random(); // this happens once, and will be great at preventing duplicates
Run Code Online (Sandbox Code Playgroud)
请注意,这不能用于加密目的。