关于c#:循环中的随机数

Random number in a loop

本问题已经有最佳答案,请猛点这里访问。

在循环中产生随机数的问题。可以通过使用线程来绕过它。睡眠,但是在一个更优雅的解决方案之后。

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

最后会是11111…222…等。

建议?


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

The random number generation starts from a seed value. If the same seed is used repeatedly, the same series of numbers is generated. One way to produce different sequences is to make the seed value time-dependent, thereby producing a different series with each new instance of Random. By default, the parameterless constructor of the Random class uses the system clock to generate its seed value, ...

来源

通过将声明放在循环中,可以有效地多次调用具有相同值的构造函数,因此可以得到相同的数字。

所以你的代码应该是:

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

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

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

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


我找到了一个中文页面,上面写着:http://godleon.blogspot.hk/2007/12/c.html,上面写着如果你键入这样的内容:

江户十一〔四〕号

即使在循环中,你也可能得到一个随机数!它也解决了我的问题!


Random r = new Random();移出循环,然后在循环内调用next。


您应该在整个过程中使用相同的随机实例,而不是每次都创建一个新实例。

如你所知:

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

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

通过重复使用这样的单个随机实例:

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

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