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

C++实现成对随机数填充二维数组功能代码运行异常如何解决

代码问题分析

  • 原代码生成随机数后未校验计数就直接累加,如果该数字已累计出现2次,累加后计数直接变为3,此时while(twoCards[num - 1] > 2)才会触发重生成,但如果刚好等于2会直接存入,导致数字出现次数超过上限
  • 重生成逻辑仅判断旧随机数的计数,没有校验新生成的随机数的累计次数,完全无法过滤已经满2次的数字
  • 额外优化建议:srand(time(0))不要放在函数内部,多次调用函数时如果间隔小于1秒会生成完全相同的牌组,建议放到main函数启动时执行一次即可

修正后代码

// 需满足ROW*COL = 16,刚好对应8个数字各出现2次的需求
void getDeck(int deck[ROW][COL])
{
    int twoCards[8] = {0}; // 初始化计数数组,默认全为0
    int num = 0;
    for(int row = 0; row < ROW; row++)
    {
        for(int col = 0; col < COL; col++)
        {
            if(col % 4 == 0)
            {
                cout << endl;
            }
            // 循环生成直到找到符合次数要求的数字
            do
            {
                num = rand() % 8 + 1;
            } while (twoCards[num - 1] >= 2); // 该数字已经满2次就重新生成
            
            twoCards[num - 1]++; // 校验通过再累加计数
            deck[row][col] = num;
            cout << deck[row][col] << "    ";
        }
    }
}

实现逻辑说明

  1. 每次生成随机数后先校验对应数字的累计次数,已经达到2次就重新生成
  2. 只有确认数字未达到上限时,才累加计数并存入二维数组,完全避免超量的情况
  3. 不需要复杂的分支判断,用do-while循环即可覆盖所有校验场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 06:24:01