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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:39:03