生成无重复随机数的C#代码出现重复值问题,如何修复?
随机不重复数字生成代码问题排查与修复
问题分析
- 循环逻辑完全错误:你写的
do-while条件搞反了。刚把随机数赋值给passwordarray[i],立刻用passwordarray.Contains(passwordarray[i])检查,结果肯定是true,取反后循环条件不成立,直接跳过循环,等于根本没做去重,重复是必然的。 - 输入验证位置不对:把位数合法性判断放在
for循环里,要是输入的数字不符合要求,会循环输出digit次错误提示,完全没必要,应该在创建数组前就做验证。 - 数组范围判断错误:用整个数组做去重检查时,后面未赋值的元素默认是0,会干扰判断,比如已经存了0的话,后面的位置会误判为重复。
修复后的代码
Console.WriteLine("choose how many digits your password should be\nminimum 5 maximum 10 digits"); Console.Write("number of digits:"); // 先做输入合法性验证,同时处理非数字输入的情况 if (!int.TryParse(Console.ReadLine(), out int digit) || digit < 5 || digit > 10) { Console.WriteLine("your number of digits is less than 5 or more than 10, or input is invalid"); return; } int[] passwordarray = new int[digit]; Random r = new Random(); for (int i = 0; i < passwordarray.Length; i++) { int num; do { num = r.Next(0, 10); // 只检查数组中已经填充过的前i个元素,避免未初始化的0干扰 } while (passwordarray.Take(i).Contains(num)); passwordarray[i] = num; } // 输出生成的结果 Console.WriteLine("Generated password digits: " + string.Join("", passwordarray));
修复说明
- 输入验证优化:用
int.TryParse处理非数字输入的情况,同时一次性验证位数范围,不符合直接终止流程,避免无效循环。 - 去重逻辑修正:生成随机数后,只检查数组中已经赋值的前
i个元素(用Take(i)截取),确保判断的是已生成的数字,不会被未初始化的0干扰。 - 循环条件修正:只要生成的数字在已填充部分存在,就重新生成,直到找到不重复的再存入数组。
内容的提问来源于stack exchange,提问作者magistena
相关产品推荐
相关产品推荐

