C中的随机数

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)的调用time(NULL)始终返回相同的值。 您将在每次迭代时重置为相同的随机序列。 作为一般规则,只在程序中调用一次srand()

不要每次都通过循环调用srand() – 只需事先做一次。

常见问题13.15至13.20将是有意义的。 我很想为这些问题创建一个新标签。

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)); 

这是我的arrays......

谢尔盖,你没有得到a[i,j]版本的错误消息,因为这是一个完全有效的表达式。 逗号运算符从左到右计算子表达式,并返回最后一个表达式的值。 因此,写a[i,j]a[j]相同。 您在打印中收到的是指向矩阵中第j个向量的指针的值。