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个向量的指针的值。