比较C中的两个矩阵

时间:2015-01-10 14:19:27

标签: c random matrix compare

当我尝试比较两个矩阵时,我遇到了一个大问题。每次运行程序时,它都会打印并设置具有相同值的两个矩阵。但是你可以在下面的代码中看到,我已经将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");
    }
}

3 个答案:

答案 0 :(得分:2)

正如@ user3121023所述,您需要将srand(time(NULL));移至您的主要功能。

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

  

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

希望这有帮助。

答案 1 :(得分:1)

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

现在,您的程序运行速度很快,并且对rand的两次调用使用的srand(time)基本相同(时钟不会在调用time之间打勾)。因此,在两次调用中,伪随机生成器都从相同的种子开始,并且您使用相同的值填充矩阵。

将伪随机生成器初始化(further)移动到main中,因此只调用一次,然后查看差异。

答案 2 :(得分:0)

如您所知,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应该避免所有这些问题。