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

C++生成无重复随机数数组时自定义去重逻辑失效问题排查

问题分析

你的代码存在明确的逻辑疏漏,没有语法错误:

  • 去重校验逻辑不闭环:内层循环检测到当前array[i]和array[j]重复时,你直接生成新随机数,但没有重置j的位置从头校验新值,新生成的数可能和j位置之前的元素重复,这部分重复不会被检测到。
  • 举个实际运行的场景:当i=4时,j循环走到j=3发现值重复,你生成了新的随机数,但这个新数刚好和j=0位置的元素相等,此时j不会回到0重新比对,直接继续走完后续循环,重复值就被留在了数组里。
  • 你设置的随机数范围是rand()%12(即0~11共12个可选值),填充10个元素的数组数值范围足够,不存在可选值不足的问题。
修正方案

核心调整思路:每次为array[i]生成随机数后,完整遍历所有已经存入数组的元素做重复校验,只要发现重复就重新生成新值,再次从头做全量校验,直到确认当前值和所有已有元素都不重复,再进入下一个位置的填充。
修正后的完整可运行代码如下:

using namespace std;

void randomArray(int []);
void mostrarArray(int[]);
int main()
{
    int arrayA[10],arrayB[10];
    srand(time(NULL));
    randomArray(arrayA);
    randomArray(arrayB);
    mostrarArray(arrayA);
    mostrarArray(arrayB);
    return 0;
}

void randomArray(int array[] ) {
    int i = 0, j = 0;
    bool duplicateFlag;
    for (i = 0; i < 10; i++) {
        do {
            duplicateFlag = false;
            array[i] = rand() % 12;
            // 全量校验已存入的所有元素
            for (j = 0; j < i; j++) {
                if (array[j] == array[i]) {
                    duplicateFlag = true;
                    break;
                }
            }
        } while (duplicateFlag); // 存在重复就持续生成新数重新校验
    }
}

void mostrarArray(int array[]) {
    int i = 0;
    for (i = 0; i < 10; i++) {
        printf("%d, ", array[i]);
    }
    printf("\n\n");
}

这种do-while的写法完全匹配你需要的校验规则:新生成的数必须和数组内所有已有元素比对通过才会保留,从根源上避免了漏检导致的重复问题。

内容的提问来源于stack exchange,提问作者Valentín Sanabria

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:12:22