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

C#实现0-15唯一随机数填充二维数组问题求助

问题分析与修复方案

原代码的核心问题是重复检查逻辑完全错误,导致无法正确识别已生成的随机数,进而出现重复值。

原代码错误点

在do-while循环内的重复检查部分,你编写的代码存在索引逻辑错误:

for (int k = 0; k < 4; k++)
{
    for (int l = 0; l < 4; l++)
    {
        if (numbers[k, j] == rand_num)
        {
            unique = false;
        }
    }
}

这段代码的问题:

  • 错误地仅检查所有行的当前j列,而非已经填充完成的所有位置
  • 会遍历到未填充的数组默认值(0),导致误判,让重复值绕过循环

修复后的代码

修改重复检查逻辑,仅遍历已经填充好的元素(当前位置之前的所有元素):

Random r = new Random();
int[,] numbers = new int[4, 4];

for (int i = 0; i < 4; i++)
{
    for (int j = 0; j < 4; j++)
    {
        bool unique;
        int rand_num;
        do
        {
            unique = true;
            rand_num = r.Next(16);
            // 检查当前行之前的所有行
            for (int k = 0; k < i; k++)
            {
                for (int l = 0; l < 4; l++)
                {
                    if (numbers[k, l] == rand_num)
                    {
                        unique = false;
                        break; // 找到重复直接退出内层循环
                    }
                }
                if (!unique) break; // 外层循环也直接退出
            }
            // 检查当前行中已填充的列
            for (int l = 0; l < j; l++)
            {
                if (numbers[i, l] == rand_num)
                {
                    unique = false;
                    break;
                }
            }
        } while (!unique);
        
        numbers[i, j] = rand_num;
    }
}

额外优化说明

  • 找到重复后立即break循环,避免不必要的遍历,提升效率
  • 将unique和rand_num的声明移至内层循环,缩小变量作用域,更符合C#编码规范

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 12:20:32