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