C#为啥在随机数中得到一个零数

Posted

技术标签:

【中文标题】C#为啥在随机数中得到一个零数【英文标题】:C# Why get a zero number in random numberC#为什么在随机数中得到一个零数 【发布时间】:2021-04-02 21:55:28 【问题描述】:

我正在尝试使用随机数创建一个数组列表。但有时我的结果为零。我不明白为什么。

如果有人能解释一下,我很感激。

int[] number = new int[6];
Random rnd = new Random();
for (int i = 0; i < number.Length; i++)

   int random = rnd.Next(1, 26);
   if (!number.Contains(random))
   
     number[i] = random;
   

foreach (int nr in number)

  Console.Write("|" + nr + "|");

//results
|6||12||0||22||25||11|

【问题讨论】:

取出if (!number.Contains(random)),你会看到0是如何到达那里的。 提示 - 如果两次生成相同的随机数。 这里更好的解决方案是使用HashSet&lt;int&gt; 而不是数组。循环调用Add,直到Count == 6。然后调用ToArray。将自动满足重复项。 ***.com/questions/15300073/… 和 ***.com/questions/26931528/… 是最合适的重复项。 在 else 语句中添加 'i--',在重复的情况下重新生成值 【参考方案1】:
int[] number = new int[6];

这里的数字数组是用默认的int值创建的,即0

您的代码的问题是在某些情况下,由于检查,该值没有得到更新if (!number.Contains(random))

您可以更改代码以包含一个循环,以确保您的随机数不在数组中。

int[] number = new int[6];
Random rnd = new Random();
for (int i = 0; i < number.Length; i++)

   int random = rnd.Next(1, 26);
   while (number.Contains(random))
   
      random = rnd.Next(1, 26);
   
   number[i] = random;

foreach (int nr in number)

  Console.Write("|" + nr + "|");

请注意,当前的方法非常耗性能,因为对于每个新的随机值,我们每次都遍历整个数组以检查它是否存在。如果可能,您可以使用HashSet&lt;int&gt; 来降低性能

【讨论】:

另一个问题是,如果number = new int[24](或者通常它的长度接近随机数的范围),“找到”未使用的数字可能会变得困难。【参考方案2】:
    当您在以下语句中声明数组时,它会使用 6 个整数初始化为 0 int[] number = new int[6]; 虽然为每个数组元素生成随机数,但检查以下语句中的重复可能导致错误 if (!number.Contains(random))

这就是为什么它从未更新为新分配的号码。 您可以为其添加 else 条件并重新生成随机数

【讨论】:

【参考方案3】:

只需使用调试器单步调试代码并检查变量以查看发生了什么。除了这里的所有建议(因为它们可能循环太多次甚至永远循环很糟糕)之外,您似乎希望获得 6 个介于 1 和 26 之间的随机、唯一数字。

这样做的实际方法是使用这些数字 (Enumerable.Range()) 生成一个列表,将它们随机排列 (Fisher-Yates) 和 Take() 前六个。

【讨论】:

【参考方案4】:

使用while循环。

int[] number = new int[6];
Random rnd = new Random();
int i = 0;
while (i < number.Length)

   int random = rnd.Next(1, 26);
   if (!number.Contains(random))
   
     number[i] = random;
     i++;
   

foreach (int nr in number)

  Console.Write("|" + nr + "|");

【讨论】:

以上是关于C#为啥在随机数中得到一个零数的主要内容,如果未能解决你的问题,请参考以下文章

为啥我总是用 rand() 得到相同的随机数序列?

为啥我总是用 rand() 得到相同的随机数序列?

为啥我的随机数生成器在 C# 中看起来不是随机的?

C#中能得到随机数的函数是啥啊,怎么才能将随机输出的随机数赋给一个变量?

为啥在递增 int 时会得到随机结果 [关闭]

c#中,怎么产生一个随机数?