【问题标题】:C# Why get a zero number in random numberC#为什么在随机数中得到一个零数
【发布时间】:2023-03-08 11:45:01
【问题描述】:

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

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

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。将自动满足重复项。
  • 在 else 语句中添加 'i--',在重复的情况下重新生成值

标签: c# arrays random


【解决方案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】:
  1. 当您在以下语句中声明数组时,它会使用 6 个整数初始化为 0 int[] number = new int[6];
  2. 虽然为每个数组元素生成随机数,但检查以下语句中的重复可能导致错误 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 + "|");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多