C++生成100x100正奇数随机矩阵却输出0和负数的问题
问题排查与解决:生成正奇数100x100随机矩阵错误
问题原因
- 循环逻辑完全错误:原代码仅在生成奇数时同时递增行索引
i和列索引j,最终仅会填充矩阵的对角线元素(matrix[0][0]到matrix[99][99]),其余9900个元素未初始化,输出的是栈内存中的随机垃圾值(包括0、负数等)。 - 冗余判断:
random > 0毫无意义,因为1 + rand()%100的结果必然在1-100之间,不可能小于等于0。
解决方法
需要遍历矩阵的每一个元素,为每个元素生成正奇数。可以直接构造奇数随机数,避免无效的循环判断:
修正后的代码
#include <iostream> #include <stdlib.h> #include <time.h> using namespace std; int main() { int matrix[100][100]; srand(time(NULL)); // 遍历矩阵的每一行 for (int i = 0; i < 100; i++) { // 遍历当前行的每一列 for (int j = 0; j < 100; j++) { // 直接生成1-99之间的正奇数 // rand()%50 得到0-49,乘2得0-98,加1得1-99的奇数 matrix[i][j] = (rand() % 50) * 2 + 1; } } // 输出矩阵 for (int i = 0; i < 100; i++) { for (int j = 0; j < 100; j++) { cout << matrix[i][j] << " "; } cout << "\n"; } return 0; }
代码说明
- 采用嵌套循环正常遍历矩阵的每一个元素,确保所有10000个位置都被赋值。
- 直接构造奇数:
(rand() % 50) * 2 + 1生成1到99之间的正奇数,无需额外判断,效率更高。 - 如果需要更大范围的正奇数,可调整公式,比如生成1到199的奇数:
(rand() % 100) * 2 + 1。
内容的提问来源于stack exchange,提问作者Pandanube
相关产品推荐
相关产品推荐

