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

C#生成无重复随机数数组遇阻:Array.Exists使用无效求助

解决生成不重复随机整数数组的问题

原代码的问题分析

你的代码存在两个关键逻辑错误:

  1. 条件判断颠倒:当Array.Exists返回false(当前随机数未在数组中存在)时,应该将数值存入数组,而非执行i--;只有当返回true(数值已存在)时,才需要重新生成并回退下标。
  2. 初始值干扰:新建的int[]数组默认所有元素为0,第一次生成0时,会被误判为已存在,导致无法正常存入第一个0值。

修正后的原逻辑代码

调整判断逻辑,同时初始化数组为非目标范围的数值避免干扰:

static void Main(string[] args)
{
    Random Rnd = new Random();
    int[] Numbers = new int[10];
    // 初始化数组为-1,避免和0-9的随机数范围冲突
    Array.Fill(Numbers, -1);

    for (int i = 0; i < Numbers.Length; i++)
    {
        int rast = Rnd.Next(10);
        bool exists = Array.Exists(Numbers, element => element == rast);
        if (exists)
        {
            // 数值已存在,回退下标重新生成
            i--;
        }
        else
        {
            // 数值不存在,存入数组
            Numbers[i] = rast;
        }
    }

    foreach (int item in Numbers)
    {
        Console.WriteLine(item);
    }
}

更高效的实现方法

上述方法在随机数范围接近数组长度时,可能多次重复生成数值,效率较低。推荐两种更优方案:

方法1:利用HashSet自动去重

HashSet天然不允许重复元素,可快速判断元素是否存在:

static void Main(string[] args)
{
    Random Rnd = new Random();
    HashSet<int> uniqueNumbers = new HashSet<int>();
    
    while (uniqueNumbers.Count < 10)
    {
        int rast = Rnd.Next(10);
        uniqueNumbers.Add(rast); // Add方法会自动忽略重复元素
    }

    int[] Numbers = uniqueNumbers.ToArray();
    
    foreach (int item in Numbers)
    {
        Console.WriteLine(item);
    }
}

方法2:生成有序序列后打乱(洗牌法)

如果目标随机数范围正好等于数组长度(如本例生成0-9的不重复数),先生成有序数组再打乱顺序,效率最高:

static void Main(string[] args)
{
    Random Rnd = new Random();
    // 生成0到9的有序数组
    int[] Numbers = Enumerable.Range(0, 10).ToArray();
    
    // 洗牌算法打乱元素顺序
    for (int i = Numbers.Length - 1; i > 0; i--)
    {
        int j = Rnd.Next(i + 1);
        // 交换两个元素的位置
        (Numbers[i], Numbers[j]) = (Numbers[j], Numbers[i]);
    }

    foreach (int item in Numbers)
    {
        Console.WriteLine(item);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:27:28