C++生成无重复随机数代码死循环及输出异常如何解决?
问题修复方案
你的代码存在2处核心错误,直接导致死循环和输出异常,以下是具体问题和修复方案:
错误点说明
- 输出索引误用:main函数内层输出循环中,误将外层循环变量
i作为数组下标访问arr,导致每行3次输出的是同一个位置的值,因此每行数字完全重复。 - 去重逻辑反转:
UniqRandInt函数中if判断逻辑写反:inArray返回true代表生成的随机数已经在结果数组中存在,需要跳过重抽;你当前的逻辑是只有随机数已存在时才存入数组,而第一次循环cntr=0时inArray永远返回false,永远进不了赋值分支,cntr无法递增,直接陷入死循环。
修复后的完整代码
#include <iostream> #include <cstdlib> const int MAX = 6; const int SIZE_OF_SAMPLES = 3; const int REP = 5; bool inArray (int[], int, int ); void UniqRandInt (int, int, int[]); int main() { int arr[SIZE_OF_SAMPLES]; srand(9809); // 初始化随机数种子 for (int i = 0; i < REP; i++) { UniqRandInt(MAX, SIZE_OF_SAMPLES, arr); for(int j = 0; j < SIZE_OF_SAMPLES; j++) { // 修复点1:将arr[i]改为arr[j],使用内层循环变量访问对应位置的元素 std::cout << arr[j] << " "; } std::cout << std::endl; } return 0; } void UniqRandInt(int max, int n, int result[]) { int cntr = 0, r; while(cntr < n) { r = rand(); // 生成随机数 r = r % (max + 1); // 修复点2:添加逻辑非运算符,仅当随机数不在数组中时才存入结果 if (!inArray(result, cntr, r)) { result[cntr] = r; cntr++; } } return; } bool inArray(int array[], int arrSize, int x) { for (int i = 0; i < arrSize; ++i) { if (array[i] == x) { return true; } } return false; }
修复后即可输出符合要求的5行数据,每行包含3个0~6范围内的不重复随机数。
内容的提问来源于stack exchange,提问作者turner89
相关产品推荐
相关产品推荐

