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

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()。
  • 原代码的核心问题:
    1. 缺少<stdlib.h>头文件,rand和srand是标准库函数,必须包含这个头文件,不能自己乱声明。
    2. 一维数组serie的存储逻辑错误:原代码只存了每行最后一个元素到serie[i],漏掉了其他元素,需要用一个递增的索引(比如index)把每个矩阵元素按顺序存入数组。
    3. 原函数返回局部数组的元素是无效操作,局部数组在函数结束后会被销毁,正确做法是把一维数组作为参数传入函数,让函数填充它。
  • 生成副本的规则:通过索引 = 行号 * 列数 + 列号的公式,从一维数组中取出对应位置的值,直接填充新矩阵即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:15:35