C语言中如何复制随机生成的矩阵(不重新生成随机数)
问题:不重新生成随机数的前提下生成矩阵精确副本
需求:根据用户输入的行列数,生成元素为0-19随机数的矩阵。
当前问题:搞不懂怎么在不重新生成随机数的前提下,生成该矩阵的精确副本。试过用一维数组存储随机值,但不确定这个方案是否正确。附上当前生成矩阵的代码,寻求技术帮助。
当前代码(修正了基础语法问题)
#include <stdio.h> #include <time.h> #include <stdlib.h> // 补充:rand和srand的标准头文件 // 修正函数声明,原声明不符合逻辑 void matrizAleatoria(int m, int n, int* serie); int main() { int m, n; printf("输入行数:\n"); scanf("%d", &m); printf("输入列数:\n"); scanf("%d", &n); printf("\n"); srand(time(0)); int total = m * n; int serie[total]; // 提前分配存储所有随机数的一维数组 // 生成原矩阵并把随机数存入serie matrizAleatoria(m, n, serie); printf("\n--- 矩阵副本 ---\n"); // 用serie直接生成副本矩阵,无需重新生成随机数 for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { int index = i * n + j; printf("[ %-2d ] ", serie[index]); } printf("\n"); } return 0; } // 修改函数:填充原矩阵的同时,把所有随机数按顺序存入一维数组 void matrizAleatoria(int m, int n, int* serie) { int i, j; int matriz1[m][n]; int index = 0; for(i = 0; i < m; i++) { for(j = 0; j < n; j++) { matriz1[i][j] = rand() % 20; serie[index++] = matriz1[i][j]; // 逐个存储每个随机数 printf("[ %-2d ] ", matriz1[i][j]); } printf("\n"); } }
关键说明
- 你用一维数组存储随机值的思路完全正确,核心逻辑就是:把所有生成的随机数先一次性存到数组里,后续生成副本时直接读取数组里的值,不再调用rand()。
- 原代码的核心问题:
- 缺少
<stdlib.h>头文件,rand和srand是标准库函数,必须包含这个头文件,不能自己乱声明。 - 一维数组
serie的存储逻辑错误:原代码只存了每行最后一个元素到serie[i],漏掉了其他元素,需要用一个递增的索引(比如index)把每个矩阵元素按顺序存入数组。 - 原函数返回局部数组的元素是无效操作,局部数组在函数结束后会被销毁,正确做法是把一维数组作为参数传入函数,让函数填充它。
- 缺少
- 生成副本的规则:通过
索引 = 行号 * 列数 + 列号的公式,从一维数组中取出对应位置的值,直接填充新矩阵即可。
内容的提问来源于stack exchange,提问作者Mx_Cg
相关产品推荐
相关产品推荐

