You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保去重后List<int>仍保持用户指定的随机整数数量?

解决C#生成指定长度无重复随机整数列表的问题

问题原因

你当前的代码存在两个核心问题:

  1. 固定循环次数未处理重复值:循环仅执行Gruppe1次,每次生成随机数后去重。如果出现重复值,去重后的列表长度会小于目标值,且循环不会补充缺失的数量。
  2. 冗余操作浪费性能:每次循环都重复执行去重、排序和标签更新,完全没必要,只会降低代码效率。

另外还有潜在风险:如果用户输入的Gruppe1大于12(你生成的是1-12的随机数),逻辑会陷入死循环,永远凑不够数量。

解决方案

核心思路是持续生成随机数,直到无重复集合达到目标长度,同时先做输入合法性校验,避免无效输入导致的异常或死循环。推荐用HashSet<int>存储随机数,它会自动忽略重复元素,无需手动判断。

优化后代码

// 输入转换与合法性校验
if (!int.TryParse(Value1, out int gruppe1) || gruppe1 < 1 || gruppe1 > 12)
{
    if (labelArray1.Length > 0)
    {
        labelArray1[0].Text = "请输入1-12之间的整数";
    }
    return;
}

// Random建议声明为类成员变量,避免短时间重复实例化导致随机序列重复
Random random = new Random();
HashSet<int> uniqueNumbers = new HashSet<int>();

// 持续生成随机数,直到集合达到目标长度
while (uniqueNumbers.Count < gruppe1)
{
    int randomNum = random.Next(1, 13); // 生成1-12的随机数(左闭右开)
    uniqueNumbers.Add(randomNum); // HashSet自动跳过重复值
}

// 转换为有序列表
List<int> sortedNumbers = uniqueNumbers.OrderBy(num => num).ToList();

// 统一更新标签控件
for (int j = 0; j < sortedNumbers.Count; j++)
{
    labelArray1[j].Text = sortedNumbers[j].ToString();
}

代码说明

  1. 输入校验:用int.TryParse替代Convert.ToInt32,避免输入非数字时抛出异常;同时限制输入范围为1-12,因为1-12最多只能生成12个不重复的数。
  2. HashSet去重:HashSet的Add方法会自动忽略已存在的元素,比List的Contains方法效率更高,无需手动判断数值是否重复。
  3. 循环补全数量:通过while循环持续生成随机数,直到集合长度达到目标值,确保最终列表长度符合要求。
  4. 统一更新标签:等最终有序列表生成后再一次性更新标签,避免冗余操作,提升性能。
  5. Random实例化:建议将Random声明为类的成员变量,不要在循环内部实例化——短时间内多次实例化Random会因为种子相同(默认用系统时间),导致生成重复的随机序列。

内容的提问来源于stack exchange,提问作者CodingAcademyStudent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 09:03:19