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

生成无重复随机数的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));

修复说明

  1. 输入验证优化:用int.TryParse处理非数字输入的情况,同时一次性验证位数范围,不符合直接终止流程,避免无效循环。
  2. 去重逻辑修正:生成随机数后,只检查数组中已经赋值的前i个元素(用Take(i)截取),确保判断的是已生成的数字,不会被未初始化的0干扰。
  3. 循环条件修正:只要生成的数字在已填充部分存在,就重新生成,直到找到不重复的再存入数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:27:24