比较 C 中的两个矩阵



当我尝试比较两个矩阵时,我遇到了一个大问题。每次运行程序时,它都会打印并设置具有相同值的两个矩阵。但是,您可以在下面的代码中看到,我用随机数放置了 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.nn");
    }
    else{
        printf("Those matrix are NOT equal.nn");
    }
}

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

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

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

希望这有帮助。

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

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

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

如您所知,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;
        }
    }
 }

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

相关内容

  • 没有找到相关文章