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

时间:2015-05-13 12:50:47

标签: c macos random srand

我有以下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)?

有简单的替代方案吗?

2 个答案:

答案 0 :(得分:6)

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

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

因此,只需选择正确的种子和RNG功能。

答案 1 :(得分:4)

嗯,这里的问题是由于多种方式使用标准库在C中制作随机数。

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

  

从rand(3)手册:

   #include <stdlib.h>

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

从随机(3)手册:

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

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