Random number in a loop
在循环中产生随机数的问题。可以通过使用线程来绕过它。睡眠,但是在一个更优雅的解决方案之后。
1 2 3
| for ...
Random r = new Random ();
string += r .Next(4); |
最后会是11111…222…等。
建议?
- 如果这个循环不止是几次迭代,那么您将希望放弃字符串连接,转而使用StringBuilder对象。
- @安东尼:不,他每次迭代都要花更多的时间。
- @亨克…很明显。我建议使用一个嵌套的for循环,其中包含单个空间的多个串联,然后立即用string.empty替换单个空间。
- 另请参见stackoverflow.com/questions/767999
将随机数生成器的声明移出循环。
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,上面写着如果你键入这样的内容:
江户十一〔四〕号
即使在循环中,你也可能得到一个随机数!它也解决了我的问题!
- 为什么要慢一点,只要1〔0〕就够了
- @纳法尔,我真的不明白你在说什么??!!不是我做的吗?
- 我是说Guid.NewGuid().GetHashCode()比new Random(Guid.NewGuid().GetHashCode())快。两者都给出随机整数
- 中文页面使用这种特殊的方法是放慢速度,以便生成更多的随机数,因为循环中使用的随机数没有足够的时间生成。
- 与使用新的guids散列代码不同,您可以在每个循环中使用简单的int递增,这将更改构造函数中的随机种子参数。这种方法会更快。
- @碎片为什么不添加你的答案,这样我们可以有更多的选择:)
将Random r = new Random();移出循环,然后在循环内调用next。
- 我本该重新加载这页的。哈哈,每个人都有同样的答案
- 问题是"循环内部"
- @也许你没有读完我的全部答案,我也声明留下"下一个在循环中"。接受的答案和我描述的完全一样,所以我假设它符合OP的要求。
您应该在整个过程中使用相同的随机实例,而不是每次都创建一个新实例。
如你所知:
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)时,值都会更新(基本上每个调用的种子都是不同的)。