C: srand 不影响随机数生成器

C: srand does not influence random number generator

我有以下c代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[]) {
  srand(time(NULL));
  printf("%d\n", (int)random());
  return 0;  
}

据我了解,每次执行程序时都应该打印不同的随机数,因为随机种子取决于系统时间。

但每次 运行 程序,我得到完全相同的输出:

1804289383

当我将自定义值作为 srand 的参数时,我仍然得到相同的输出:

srand(1);

srand(12345);

有人知道为什么会这样吗?也许是因为我的操作系统(Mac OS 10.10.3)?或者我使用的编译器 (gcc)?

是否有简单的替代方案?

C 中的标准随机数生成器是 rand(),可以用 srand(seed) 播种。

还有第二个随机数生成器,random()。这个随机生成器可以用函数 srandom(seed) 作为种子。 (这两个生成器使用不同的状态,即使它们共享相同的实现。)

所以只需选择正确的种子和 RNG 函数对即可。

好吧,您的问题是由于使用标准库在 C 中生成随机数的多种方式。

基本上,有两组函数可以生成随机数:

From the rand(3) manual:

   #include <stdlib.h>

   int rand(void);
   int rand_r(unsigned int *seedp);
   void srand(unsigned int seed);

From the random(3) manual:

   #include <stdlib.h>

   long int random(void);

   void srandom(unsigned int seed);

   char *initstate(unsigned int seed, char *state, size_t n);
   char *setstate(char *state);

您应该只选择最适合您需要的那个。 我邀请您进一步阅读这些手册以获取更多信息;-)