glibc中rand()与random()函数是否相同及源码位置咨询
GNU/Linux中rand()与random()函数的疑问解答
提问内容
我目前正在研究PRNG(伪随机数生成器),发现在GNU/Linux系统中存在rand()和random()两个函数。根据《GNU C Library》第19.8.2节说明,random()函数仅用于兼容BSD系统。我有以下问题:
- 这两个函数是否完全相同?
- 若两者相同,
random()的源码位于何处?我仅能在glibc中找到rand()的实现。
我尝试固定种子参数后,本地机器上rand()和random()生成的随机数序列一致。随后查找glibc中二者的实现,最终仅找到rand()的实现以及random()在stdlib/stdlib.h中的函数原型(非官方镜像),在Linux源码中也未找到random()的实现,想知道是否遗漏了内容。
附random()原型代码:
/* These are the functions that actually do things. The `random', `srandom', `initstate' and `setstate' functions are those from BSD Unices. The `rand' and `srand' functions are required by the ANSI standard. We provide both interfaces to the same random number generator. */ /* Return a random long integer between 0 and RAND_MAX inclusive. */ extern long int random (void) __THROW;
解答内容
在glibc中rand()和random()完全相同。
原因是glibc的random.c文件中存在语句:
weak_alias (__random, random)
该语句借助GNU C扩展的alias特性,将random()设置为__random的弱别名,而rand()的底层实现也指向同一个__random函数,因此二者本质是同一个随机数生成器的不同接口。
内容的提问来源于stack exchange,提问作者ranvd
相关产品推荐
相关产品推荐

