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

10 回答 10

21

在循环外调用srand()。您每次迭代都在重新播种。

srand()播种随机数生成器,以便您根据输入获得不同的随机数序列。您的循环运行得非常快,因此调用time(NULL)总是返回相同的值。每次迭代都将重置为相同的随机序列。作为一般规则,只srand()在程序中调用一次。

于 2010-03-15T18:23:47.930 回答
6

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

于 2010-03-15T18:23:59.623 回答
4

常见问题解答13.1513.20将很有趣。我很想为这些问题创建一个新标签。

于 2010-03-15T18:28:55.290 回答
3

srand是一个“播种”随机数生成器的函数。如果您不知道,计算机中的随机数并不是真正随机的。实际上,计算机只是有一个看似随机的数字列表,您srand可以告诉它在该列表中从哪里开始,每次调用都rand()返回列表中的下一个项目。

您编写的原因srand(time(NULL))是让随机数在每次运行程序时都不相同的某个点开始(除非程序同时启动)。

所以你在这里所做的就是反复告诉程序在同一点重新启动随机数列表(因为每次循环的时间都是相同的)。将调用移到srand循环外,您将获得正确的结果。

于 2010-03-15T18:28:35.493 回答
3

替代文字

于 2010-03-16T00:12:57.633 回答
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 一次。

于 2010-03-15T18:25:19.200 回答
1

您需要srand()在进入循环之前调用。srand()用给定的种子初始化 radnom 数生成器,并为此种子生成唯一的随机数序列。

您的循环执行速度非常快,因此每次调用都会time(NULL)产生相同的时间(以秒为单位) - 因此您在每次循环迭代时使用相同的种子初始化随机数生成器。

于 2010-03-15T18:28:52.137 回答
0
srand(time(NULL));
for(i = 0; i < n; i++){
    for(j = 0; j < (n-1); j++){
        a[i,j] = rand();
    }
}

不管。号码是一样的...

于 2010-03-15T18:35:36.523 回答
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));

这是我的数组...

于 2010-03-15T18:58:11.690 回答
0

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

于 2010-03-16T00:10:50.527 回答