C#生成无重复随机数数组遇阻:Array.Exists使用无效求助
解决生成不重复随机整数数组的问题
原代码的问题分析
你的代码存在两个关键逻辑错误:
- 条件判断颠倒:当
Array.Exists返回false(当前随机数未在数组中存在)时,应该将数值存入数组,而非执行i--;只有当返回true(数值已存在)时,才需要重新生成并回退下标。 - 初始值干扰:新建的
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
相关产品推荐
相关产品推荐

