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

