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<int>
而不是数组。循环调用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<int>
来降低性能
【讨论】:
另一个问题是,如果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#为啥在随机数中得到一个零数的主要内容,如果未能解决你的问题,请参考以下文章