题
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));
解决方案
循环外呼叫srand()
。您正在补种它的每一个迭代。
srand()
种子随机数发生器,以便你得到依赖于输入的随机数的不同的序列。你的循环运行速度非常快,所以总是time(NULL)
调用返回的值相同。要重设与每个迭代相同的随机序列。作为一般规则,只有在你的程序中调用srand()
一次。
其他提示
不要叫srand()
每一次循环 - 只是做了一次事先
srand
是一个函数,“种子”的随机数发生器。如果你不知道,在计算机中随机数是不是真正随机的。实际上,计算机只是有在它似乎随机数的列表,并使用srand
告诉它在该列表中开始,以每次调用rand()
列表返回的下一个项目。
你写srand(time(NULL))
的原因是为了获得随机数在某些时候是不会是每次运行程序(除非计划在同一时间开始)时间相同的开始。
所以,你在这里做什么反复告诉程序重新启动在同一点随机数一览表(因为时间是每次都要经过循环时间相同)。移动电话到外循环srand
,你会得到正确的结果。
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一旦外循环。
您需要进入循环之前调用srand()
。 srand()
初始化与给定的种子的radnom数生成器和用于该种子产生的随机数的唯一的序列。
您循环执行速度非常快,从而向time(NULL)
每个呼叫产生同样的时间(以秒计) - 因此初始化与在每个循环迭代相同的种子的随机数生成
srand(time(NULL));
for(i = 0; i < n; i++){
for(j = 0; j < (n-1); j++){
a[i,j] = rand();
}
}
没有问题。数是相同的...
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));
下面是我的...阵列
谢尔盖,你没有,因为这是一个完全有效的表达获得与a[i,j]
版本只是一个错误消息。逗号操作符从左至右评估子表达式并返回最后一个表达式的值。因此,写入a[i,j]
相同a[j]
。你在打印收到的是指向你的矩阵中的第j个向量的值。