rand()不返回随机值

它的一个小代码来生成一个随机厄米matrix厄密matrix 。

在每次调用rand()之前,我都调用了srand()。 但输出中仍然没有随机性。

我已经使用c99的复杂数据typesfunction来创build一个厄密matrix。 我不知道我错在哪里:(

#include <stdio.h> #include <math.h> #include <complex.h> #include <stdlib.h> #include <time.h> #define MATSIZE 5 #define RAND_RANGE 100 double complex mat[MATSIZE][MATSIZE]; void gen_mat() { int i =0,j; int real; int img; for( ;i < MATSIZE; i++) { srand(time(NULL)); real = rand()%RAND_RANGE + 1; srand(time(NULL)); img = rand()%RAND_RANGE + 1; for(j = MATSIZE; j != i ; j--) { mat[i][j] = real + img * I; mat[j][i] = conj(mat[i][j]); } srand(time(NULL)); if(i == j) mat[i][i] = rand()%RAND_RANGE + 0*I; } } void print_mat() { int i,j; for(i = 0; i < MATSIZE; i++) { for(j = 0; j < MATSIZE; j++) { printf("%f + %f *i", creal(mat[i][j]), cimag(mat[i][j])); printf(" "); } puts("\n"); } } int main() { gen_mat(); print_mat(); return 0; } 

样本输出

 [aft@centos-c physics-numaric]$ ./a.out 66.000000 + 0.000000 *i 67.000000 + 67.000000 *i 67.000000 + 67.000000 *i 67.000000 + 67.000000 *i 67.000000 + 67.000000 *i 67.000000 + -67.000000 *i 66.000000 + 0.000000 *i 67.000000 + 67.000000 *i 67.000000 + 67.000000 *i 67.000000 + 67.000000 *i 67.000000 + 67.000000 *i 67.000000 + -67.000000 *i 66.000000 + 0.000000 *i 67.000000 + 67.000000 *i 67.000000 + 67.000000 *i 67.000000 + 67.000000 *i 67.000000 + -67.000000 *i 67.000000 + -67.000000 *i 66.000000 + 0.000000 *i 67.000000 + 67.000000 *i 67.000000 + 67.000000 *i 67.000000 + -67.000000 *i 67.000000 + -67.000000 *i 67.000000 + -67.000000 *i 66.000000 + 0.000000 *i 

在main()编辑调用srand实际上解决了这个问题。 感谢你们。

 [aft@centos-c physics-numaric]$ ./a.out 31.000000 + 0.000000 *i 81.000000 + 75.000000 *i 81.000000 + 75.000000 *i 81.000000 + 75.000000 *i 81.000000 + 75.000000 *i 81.000000 + -75.000000 *i 53.000000 + 0.000000 *i 69.000000 + 57.000000 *i 69.000000 + 57.000000 *i 69.000000 + 57.000000 *i 69.000000 + 57.000000 *i 69.000000 + -57.000000 *i 27.000000 + 0.000000 *i 93.000000 + 11.000000 *i 93.000000 + 11.000000 *i 93.000000 + 11.000000 *i 69.000000 + -57.000000 *i 93.000000 + -11.000000 *i 58.000000 + 0.000000 *i 76.000000 + 78.000000 *i 76.000000 + 78.000000 *i 69.000000 + -57.000000 *i 93.000000 + -11.000000 *i 76.000000 + -78.000000 *i 67.000000 + 0.000000 *i 

Solutions Collecting From Web of "rand()不返回随机值"

在每次打电话给rand之前,不要打电话给srand 。 程序启动时调用一次。

如果循环中不要调用srand 。 只调用一次。

 srand(time(NULL)); for( ;i < MATSIZE; i++) { // ... calls to rand() } 

否则,你用相同的种子种子随机生成器(因为它足够快,可以得到相同的时间)

顺便说一句,我发现很多时候为程序/序列创建一个初始化函数的初始化很多东西,包括随机生成(例如调用srand()

你不想每次都用srand()给随机数发生器播种! 只需在程序开始时调用一次即可。 然后调用rand()来获得下一个随机数。

不要这样做:

 rand()%RAND_RANGE + 0*I; 

,因为如果RAND_RANGE和RAND_MAX + 1没有被分割,它将导致较低的值被过采样。 (“几乎总是”的情况)

另外:根据时间(NULL)重新启动生成器在大多数情况下将以完全相同的值重新启动,因为time_t的粒度为1秒。

最后:rand_max将有至少 15位(32K)的随机值。 旧的系统实际上可能只提供15位,周期为32K。

更新:这是wakkerbot的一个片段。 urnd()函数试图返回0和范围之间的无偏值。 测试可能会更优雅地执行。

 typedef unsigned long long BigThing; unsigned int urnd(unsigned int range) { static bool flag = FALSE; if (flag == FALSE) { #if defined(__mac_os) || defined(DOS) srand(time(NULL)); #else srand48(time(NULL)); #endif } flag = TRUE; #if defined(__mac_os) || defined(DOS) return rand()%range; #else if (range <= 1) return 0; while(1) { BigThing val, box; #if WANT_RDTSC_RANDOM val = rdtsc_rand(); #else val = lrand48(); #endif /* we need this to avoid oversampling of the lower values. * Oversampling the lower values becomes more of a problem if (UNSIGNED_MAX/range) gets smaller */ box = val / range; if ((1+box) *range < range) continue; return val % range; } #endif }