比较C中的两个矩阵

Comparing two matrix in 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.\n\n");
    }
    else{
        printf("Those matrix are NOT equal.\n\n");
    }
}

rand返回的数字不是随机的,它们是'pseudo-random'。 rand 是确定性的。 为了使程序的不同运行产生不同的伪随机数,伪随机生成器(rand)通常由一些'random'数字(例如当前时间或PID)初始化,这就是srand 确实如此。 如果用相同的数字初始化生成器,rand 将产生相同的序列。

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

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

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

这里的问题是你在每个矩阵之前用 srand(time(NULL)) 播种 rand,并且 time returns 几秒钟。因此,如果对 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 应该可以避免所有这些问题。

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

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

Seed is usually taken from the current time, which are the seconds, as in time(NULL), so if you always set the seed before taking the random number, you will get the same number as long as you call the srand/rand combo multiple times in the same second.

希望对您有所帮助。