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

3

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

是否有简单的替代方案?


5
random()是什么?也许它与srand()无关?或者你的意思是要使用rand()?你需要使用srandom()来设置random()的种子。 - juanchopanza
10
srand用于设置rand的种子,而不是random的种子,random的种子需要使用srandom - M Oehm
谢谢 oehm。看起来有效。你想写个答案,这样我就能给你点数了吗? - Rafael Bankosegger
即使您使用了正确的种子,您仍然会遇到一个问题,那就是您只生成了一个数字。不存在所谓的“一个随机数”——您将拥有的是种子的哈希函数。 - Lee Daniel Crocker
2个回答

6

C语言中的标准随机数生成器是rand(),可以使用srand(seed)进行种子设置。

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

因此,只需选择正确的种子设置和RNG函数对。


4

您在这里遇到的问题是由于使用标准库在C语言中有多种生成随机数的方式。

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

来自rand(3)手册:

   #include <stdlib.h>

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

来自 random(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);

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


1
srandrand由ISO C标准定义,在所有C实现中都存在。srandomrandom由POSIX定义,不太可移植(但可能比srand/rand更高质量)。 - Keith Thompson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接