【问题标题】:Comparing two matrix in C比较C中的两个矩阵
【发布时间】:2015-01-10 14:19:26
【问题描述】:

当我尝试比较两个矩阵时,我遇到了一个大问题。每次我运行程序时,它都会打印并设置两个矩阵具有相同的值。但是您可以在下面的代码中看到,我放置了 2 个带有随机数的不同矩阵,但它在两个矩阵中始终打印相同的数字...失败在哪里?

#include <stdio.h>
#include <time.h>

void further(int matrix[][3]);
void check(int mat[][3], int another[][3]);

int main (){
    int mat[3][3];
    int another[3][3];

    further(mat);
    further(another);
    check(mat,another);

    system("pause");
    return 0;
}

void further(int matrix[][3]){
    srand(time(NULL));
    int i,j,aux;
    for(i=0; i<3; i++){
        for(j=0; j<3;j++){
            aux=rand()%10;
            matrix[i][j]=aux;
        }
    }
 }

void check(int mat[][3], int another[][3]){
    int i,j,aux;
    aux = 0;
    for(i=0; i<3 && aux == 0; i++){
        for(j=0; j<3 && aux == 0; j++){
            if(mat[i][j] != another[i][j]){
                aux = 1;
            }
        }
    }
    for(i=0; i<3; i++){
        for(j=0; j<3; j++){
            printf("%i ",mat[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    for(i=0; i<3; i++){
        for(j=0; j<3; j++){
            printf("%i ",another[i][j]);
        }
        printf("\n");
    }
    if(aux==0){
        printf("Those matrix are equal.\n\n");
    }
    else{
        printf("Those matrix are NOT equal.\n\n");
    }
}

【问题讨论】:

  • 我猜 user3121023 是对的。我认为你两次得到相同的随机数序列(因为 rand() 是一个伪随机生成器,你可能在 srand(time(NULL)) 中使用相同的种子对其进行初始化)
  • OT:还要注意time_t 不一定需要是整数。它很可能是一个指针或一个结构,或者......在 POSUX 系统上,但是 time_t 保证是一种算术类型。

标签: c random matrix compare


【解决方案1】:

正如@user3121023 在问题的cmets 中所说,您需要将srand(time(NULL)); 移动到您的主要功能。

你可以找到一个很好的解释为什么它是必要的here;重点如下:

种子通常取自当前时间,也就是秒,如time(NULL),所以如果总是在取随机数之前设置种子,只要调用srand就会得到相同的数字/rand 组合多次在同一秒内

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    rand 返回的数字不是随机的,它们是“伪随机”。 rand 是确定性的。 为了使伪随机数对于不同的程序运行有所不同,伪随机生成器(rand)通常由一些“随机”数(例如当前时间或 PID)初始化,这就是srand 所做的。 如果用相同的编号初始化生成器,rand 将产生相同的序列。

    现在,您的程序运行得很快,对srand(time) 的两次调用都使用基本相同的time(在对further 的调用之间时钟不会滴答作响)。因此,在这两个调用中,伪随机生成器都从相同的种子开始,并且您正在用相同的值填充矩阵。

    将伪随机生成器初始化 (srand) 移到 main 中,这样它只会被调用一次,看看有什么不同。

    【讨论】:

      【解决方案3】:

      如您所知,srand 用于播种rand 伪随机数生成器,如果您使用相同的种子两次,您将获得完全相同的随机数序列。

      这里的问题是你在每个矩阵之前用srand(time(NULL)) 播种rand,time 返回秒数。因此,如果这两次对 srand 的调用之间的间隔不到一秒,您将拥有相同的种子,并生成相同的数字。

      您应该将 srand 调用移至 main 并将其从 further 中删除,或者确保您不会在同一秒内调用它两次。

      以下是这两个函数在更改后的样子:

      int main (){
          srand(time(NULL));
      
          int mat[3][3];
          int another[3][3];
      
          further(mat);
          further(another);
          check(mat,another);
      
          system("pause");
          return 0;
      }
      
      void further(int matrix[][3]){
          int i,j,aux;
          for(i=0; i<3; i++){
              for(j=0; j<3;j++){
                  aux=rand()%10;
                  matrix[i][j]=aux;
              }
          }
       }
      

      根据经验,在做任何事情之前在 main 中调用 srand 应该可以避免所有这些问题。

      【讨论】:

        猜你喜欢
        • 2010-10-30
        • 1970-01-01
        • 2017-10-27
        • 2016-08-03
        • 1970-01-01
        • 1970-01-01
        • 2012-03-08
        • 1970-01-01
        • 2023-03-23
        相关资源
        最近更新 更多