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] << " "; } } }
实现逻辑说明
- 每次生成随机数后先校验对应数字的累计次数,已经达到2次就重新生成
- 只有确认数字未达到上限时,才累加计数并存入二维数组,完全避免超量的情况
- 不需要复杂的分支判断,用do-while循环即可覆盖所有校验场景
内容的提问来源于stack exchange,提问作者Noah Valentine
相关产品推荐
相关产品推荐

