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
相关产品推荐
相关产品推荐

