for(i = 0; i < n; i++){
srand(time(NULL));
printf("%d ", time(NULL));
for(j = 0; j < (n-1); j++){
a[i][j] = rand();
}
}
我尝试生成随机数,但它们是相同的...我尝试srand(i * time(NULL))
。不管..
我该怎么办?
数组声明:
int** a;
int i;
printf("Enter array size: ");
scanf("%d", &n);
a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
a[i] = (int*)calloc(n-1, sizeof(int));
答案 0 :(得分:20)
在循环之外调用srand()
。您每次迭代都会重新播种。
srand()
播种随机数生成器,以便根据输入获得不同的随机数序列。您的循环运行速度非常快,因此对time(NULL)
的调用始终返回相同的值。您将在每次迭代时重置为相同的随机序列。一般来说,只需在程序中调用srand()
一次。
答案 1 :(得分:6)
每次循环都不要调用srand()
- 只需事先做一次。
答案 2 :(得分:4)
答案 3 :(得分:3)
srand
是一个“种子”随机数生成器的函数。如果您不知道,计算机中的随机数字并不是随机的。实际上,计算机只有一个似乎随机的数字列表,你使用srand
告诉它在该列表中的起始位置,每次调用rand()
都会返回下一个项目。列表。
你写srand(time(NULL))
的原因是为了让每次运行程序时某些点的随机数都不一样(除非程序同时启动)。< / p>
所以你在这里做的是反复告诉程序在同一点重启随机数列表(因为每次循环时的时间都相同)。将呼叫移至循环外的srand
,您将获得正确的结果。
答案 4 :(得分:3)
答案 5 :(得分:2)
srand(time(NULL));
for(i = 0; i < n; i++){
printf("%d ", time(NULL));
for(j = 0; j < (n-1); j++){
a[i,j] = rand();
}
}
在循环外调用srand。
答案 6 :(得分:1)
您需要在进入循环之前调用srand()
。 srand()
使用给定的种子初始化radnom数生成器,并为该种子生成唯一的随机数序列。
您的循环执行速度非常快,因此每次调用time(NULL)
都会产生相同的时间(以秒为单位) - 因此您在每次循环迭代时使用相同的种子初始化随机数生成器。
答案 7 :(得分:0)
srand(time(NULL));
for(i = 0; i < n; i++){
for(j = 0; j < (n-1); j++){
a[i,j] = rand();
}
}
不管。数字是一样的......
答案 8 :(得分:0)
int** a;
int i;
printf("Enter array size: ");
scanf("%d", &n);
if( n < 1 ){
printf("Size should be > 0\n\n");
return NULL;
}
a = (int**)calloc(n, sizeof(int));
for(i = 0; i < n; i++)
a[i] = (int*)calloc(n-1, sizeof(int));
这是我的阵列......
答案 9 :(得分:0)
a[i,j]
版本的错误消息,因为这是一个完全有效的表达式。逗号运算符从左到右计算子表达式,并返回最后一个表达式的值。因此,写a[i,j]
与a[j]
相同。您在打印中收到的是指向矩阵中第j个向量的指针值。