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()每一次循环 - 只是做了一次事先

常见问题解答 13.1513.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));

下面是我的...阵列

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top