C-有什么方法可以多次初始化srand吗



有什么方法可以多次初始化srand吗?我有一个特定的函数来生成随机数,但每次我调用它都会给出相同的数字。有办法解决这个问题吗?

int whoatk2() {
srand(time(NULL));
int a;
a = rand() % 50;
return a;
}

除非您想要一个特定的序列,否则您应该调用srand一次,并且使用一个有效的任意值,如time(NULL)。这通常会在程序启动时完成。

如果你每次想要一个随机数时都调用它,那么你就面临着每次用相同的值初始化生成器的真正风险(如果你每秒调用它很多次(,因此会得到相同的";"随机";值。

这是你应该做的事情:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void) {
srand(time(NULL));                 // do this once
for (int i = 0; i < 10; ++i) {     // do this many times
printf("%dn", rand());
}
return 0;
}

示例输出如下所示,左列包含上面正确代码的输出,右列包含将srand调用移动到循环内的结果(交换上面有注释的两行(:

966271109          74846356
1059160369          74846356
1868029595          74846356
758240870          74846356
1795677958          74846356
806788680          74846356
1374271653          74846356
1658543317          74846356
1843517305          74846356
1568992484          74846356

srand是用种子初始化伪随机生成器的函数,rand是从生成器中获取随机数的函数。。。

由于每次调用whoatk2时都使用相同的种子重新初始化随机数生成器,因此会重复获得相同的随机数,这种情况在同一秒内发生多次。rand()返回的伪随机数序列完全由传递给srand()的值决定。

您应该在程序开始时只调用一次srand(),最好使用比time(NULL)变化更快的值。您可以使用timespec_get()gettimeofday()或类似的:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#ifdef TIME_UTC
void random_initialize(void) {
struct timespec ts;
timespec_get(&ts, TIME_UTC);
srand(ts.tv_nsec);
}
#else
#include <sys/time.h>
void random_initialize(void) {
struct timeval tv;
gettimeofday(&tv, NULL);
srand(tv.tv_usec);
}
#endif
int whoatk2(void) {
return rand() % 50;
}
int main() {
random_initialize();
for (int i = 0; i < 20; i++) {
printf("%d ", whoatk2());
}
printf("n");
return 0;
}

运行10次:

36 33 35 31 8 32 1 5 30 23 20 8 5 35 47 10 14 26 34 40
32 49 33 16 28 31 22 6 32 33 45 44 17 32 18 38 8 34 28 38
48 38 35 49 25 18 40 3 38 3 36 46 12 26 21 16 15 48 34 39
49 33 9 28 24 39 4 32 33 9 29 23 10 29 41 24 12 33 35 33
5 40 49 16 22 47 27 15 29 39 35 32 28 23 39 35 19 24 10 0
5 45 33 24 4 28 48 40 32 22 27 45 32 11 35 28 0 37 32 9
36 3 38 16 12 25 14 27 30 31 0 49 41 40 39 5 23 26 40 8
11 9 21 15 34 0 13 47 49 47 33 21 3 42 16 19 32 32 33 15
14 2 27 26 19 15 5 41 32 49 48 31 20 12 39 16 15 19 32 20
3 2 34 32 47 24 34 21 0 28 6 48 44 16 6 46 40 48 20 13

最新更新