C中的随机数

时间:2010-03-15 18:21:57

标签: c random srand

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

10 个答案:

答案 0 :(得分:20)

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

srand()播种随机数生成器,以便根据输入获得不同的随机数序列。您的循环运行速度非常快,因此对time(NULL)的调用始终返回相同的值。您将在每次迭代时重置为相同的随机序列。一般来说,只需在程序中调用srand()一次。

答案 1 :(得分:6)

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

答案 2 :(得分:4)

常见问题13.1513.20会引起您的兴趣。我很想为这些问题创建一个新标签。

答案 3 :(得分:3)

srand是一个“种子”随机数生成器的函数。如果您不知道,计算机中的随机数字并不是随机的。实际上,计算机只有一个似乎随机的数字列表,你使用srand告诉它在该列表中的起始位置,每次调用rand()都会返回下一个项目。列表。

你写srand(time(NULL))的原因是为了让每次运行程序时某些点的随机数都不一样(除非程序同时启动)。< / p>

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

答案 4 :(得分:3)

alt text

答案 5 :(得分: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。

答案 6 :(得分:1)

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

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

答案 7 :(得分:0)

srand(time(NULL));
for(i = 0; i < n; i++){
    for(j = 0; j < (n-1); j++){
        a[i,j] = rand();
    }
}

不管。数字是一样的......

答案 8 :(得分: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));

这是我的阵列......

答案 9 :(得分:0)

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