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