C# 循环中的随机数

C# 循环中的随机数,c#,random,C#,Random,在循环中产生随机数的问题。可以通过使用线程来绕过它。但是在一个更优雅的解决方案之后再睡觉 for ... Random r = new Random(); string += r.Next(4); 将以11111结束。。。222... 等等 建议?将随机数生成器的声明移出循环 随机数生成从种子值开始。如果重复使用同一种子,则生成相同的数字序列。产生不同序列的一种方法是使种子值与时间相关,从而产生一个不同的序列,每个新的随机序列实例。默认情况下,Random类的无参数构造函数使用

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

for ...
    Random r = new Random();
    string += r.Next(4);
将以11111结束。。。222... 等等


建议?

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

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

通过在循环中使用声明,您可以一次又一次地使用相同的值有效地调用构造函数——因此您得到的是相同的数字

因此,您的代码应该是:

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


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

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

正如你所说:

for ...
    Random r = new Random();
    string += r.Next(4);
种子值对于每个都是相同的(默认为当前时间戳),因此返回的值是相同的

通过重复使用单个随机实例,如下所示:

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

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

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

我发现一个中文页面,上面写着与时间相同的内容:,上面写着如果你这样键入:

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


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

如果此循环不止几次迭代,您将希望放弃字符串连接而使用
StringBuilder
对象。@Anthony:不,他需要在每次迭代中使用更多的时间。@Henk。。。明显地我建议使用一个嵌套的for循环,该循环包含单个空间的多个串联,然后立即用string.Empty替换单个空间。另请参见,我应该重新加载页面。哈哈,每个人都有相同的答案问题是“圈内”@Mironline也许你没有阅读我的全部答案,我也声明离开“圈内下一个”。接受的答案与我描述的完全一样,因此我假设它符合OP的要求。为什么要让它变慢,只需
Guid.NewGuid().GetHashCode()
enough@nawfal我真的不明白你在说什么??!!我不是这样做的吗?我的意思是
Guid.NewGuid().GetHashCode()
newrandom(Guid.NewGuid().GetHashCode())
快。两者都提供随机整数中文页面使用这种特殊的方法是减慢速度,以便在循环中使用的随机数没有足够的时间生成时生成更多的随机数。您可以在每个循环周期中使用简单的整数递增,而不是使用新的GUID哈希代码,这将更改构造函数中的随机种子参数。这种方法会更快。
Random r = new Random()
for ...
    string += r.Next(4);