循环中的随机数

有问题在循环中生成随机数。 可以通过使用Thread.Sleep来解决它,但是在更优雅的解决方案之后。

for ... Random r = new Random(); string += r.Next(4); 

最终将以11111 … 222 …等结束

建议?

将随机数生成器的声明移出循环。

随机数生成从种子值开始。 如果重复使用相同的种子,则生成相同的数字序列。 产生不同序列的一种方法是使种子值与时间相关,从而与每个新的Random实例产生不同的序列。 默认情况下,Random类的无参数构造函数使用系统时钟生成其种子值,…

资源

通过在循环中声明你有效地一遍又一遍地调用具有相同值的构造函数 – 因此你得到相同的数字。

所以你的代码应该变成:

 Random r = new Random(); for ... string += r.Next(4); 
 Random r = new Random(); for ... string += r.Next(4); 

new Random()将根据当前日期和时间使用种子初始化(伪)随机数生成器。 因此,在相同日期和时间创建的两个Random实例将产生相同的数字序列。

您在每次迭代中创建了一个新的随机数生成器,然后获取该序列的第一个值。 由于随机数发生器是相同的,它们序列的第一个值是相同的。 我的解决方案将创建一个随机数生成器,然后返回序列的第一个,第二个……等值(将是不同的)。

移动Random r = new Random(); 在循环之外,只需在循环内调用next。

我发现一个中文页面跟时间说的一样: http : //godleon.blogspot.hk/2007/12/c.html ,它说如果你这样输入:

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

你甚至可以在一个循环中得到一个随机数! 它也解决了我的问题!

您应该始终使用相同的Random实例,而不是每次都创建一个新实例。

如你所愿:

 for ... Random r = new Random(); string += r.Next(4); 

每个种子值相同(默认为当前时间戳),因此返回的值相同。

通过重用单个Random实例,如下所示:

 Random r = new Random() for ... string += r.Next(4); 

每次调用r.Next(4) ,值都会更新(基本上每个调用都有一个不同的种子)。