在循环中产生随机数的问题。可以使用Thread.Sleep绕过它,但是在更优雅的解决方案之后。
for ...
Random r = new Random();
string += r.Next(4);
最终将以11111 ... 222 ......等结束。
建议?
答案 0 :(得分:56)
将随机数生成器的声明移出循环。
随机数生成从种子值开始。如果重复使用相同的种子,则生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而与每个新的Random实例产生不同的序列。默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,...
通过在循环中声明你有效地一遍又一遍地调用具有相同值的构造函数 - 因此你得到相同的数字。
所以你的代码应该成为:
Random r = new Random();
for ...
string += r.Next(4);
答案 1 :(得分:9)
Random r = new Random();
for ...
string += r.Next(4);
new Random()
将使用基于当前日期和时间的种子初始化(伪)随机数生成器。因此,在同一日期和时间创建的两个Random
实例将产生相同的数字序列。
您在每次迭代中创建了一个新的随机数生成器,然后获取该序列的第一个值。由于随机数发生器是相同的,它们序列的第一个值是相同的。我的解决方案将创建一个随机数生成器,然后返回序列的第一个,第二个等...(将是不同的)。
答案 2 :(得分:3)
将Random r = new Random();
移到循环外部,然后在循环内调用next。
答案 3 :(得分:3)
我发现一个中文页面跟时间说的一样:http://godleon.blogspot.hk/2007/12/c.html,它说如果你这样输入:
Random random = new Random(Guid.NewGuid().GetHashCode());
你甚至可以在一个循环中得到一个随机数!它也解决了我的问题!
答案 4 :(得分:2)
您应该始终使用相同的Random实例,而不是每次都创建一个新实例。
如你所愿:
for ...
Random r = new Random();
string += r.Next(4);
每个种子值相同(默认为当前时间戳),因此返回的值相同。
通过重复使用单个Random实例:
Random r = new Random()
for ...
string += r.Next(4);
每次调用r.Next(4)
时,值都会更新(基本上每个调用都有不同的种子)。