RAND - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
rand,rand_r,srand-伪随机数生成器
语法
#include <stdlib.h> int rand(void); int rand_r(unsigned int *seedp); void srand(unsigned int seed);
glibc的功能测试宏要求(请参阅feature_test_macros(7)):
rand_r():
- 从glibc 2.24开始: _POSIX_C_SOURCE>= 199506L Glibc 2.23和更早版本 _POSIX_C_SOURCE
说明
rand()函数返回0到RAND_MAX(含)范围内的伪随机整数(即数学范围[0,RAND_MAX])。
srand()函数将其参数设置为rand()返回的新的伪随机整数序列的种子。通过调用具有相同种子值的srand()可重复这些序列。
如果没有提供种子值,则rand()函数将自动以值1进行种子。
函数rand()不可重入,因为它使用在每次调用时都会修改的隐藏状态。这可能只是下一个调用要使用的种子值,或者可能更复杂。为了在线程化应用程序中获得可重现的行为,必须将该状态明确化。这可以使用重入函数rand_r()完成。
与rand()类似,rand_r()返回范围为[0,RAND_MAX]的伪随机整数。 seedp参数是一个指向无符号int的指针,该int用于存储两次调用之间的状态。如果用seedp指向的整数以相同的初始值调用rand_r(),并且在两次调用之间不修改该值,则将产生相同的伪随机序列。
rand_r()的seedp参数所指向的值仅提供非常少量的状态,因此此函数将是弱伪随机生成器。尝试改用drand48_r(3)。
返回值
rand()和rand_r()函数返回一个介于0和RAND_MAX(含)之间的值。 srand()函数不返回任何值。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
rand(),rand_r(),srand() | Thread safety | MT-Safe |
遵循规范
函数rand()和srand()符合SVr4、4.3BSD,C89,C99,POSIX.1-2001。函数rand_r()来自POSIX.1-2001。 POSIX.1-2008将rand_r()标记为过时。
备注
Linux C库中rand()和srand()的版本使用与random(3)和srandom(3)相同的随机数生成器,因此低阶位应与高阶位一样随机。但是,在较旧的rand()实现和当前在不同系统上的实现中,低阶位的随机性比高阶位的随机性小得多。当需要良好的随机性时,请勿在打算用于便携式应用程序中使用此功能。 (改为使用random(3)。)
示例
POSIX.1-2001提供了以下rand()和srand()实现的示例,当一个人在两台不同的机器上需要相同的序列时,它们可能很有用。
static unsigned long next = 1; /* RAND_MAX assumed to be 32767 */ int myrand(void) { next = next * 1103515245 + 12345; return((unsigned)(next/65536) % 32768); } void mysrand(unsigned int seed) { next = seed; }
当给定特定种子时,以下程序可用于显示rand()产生的伪随机序列。
#include <stdlib.h> #include <stdio.h> int main(int argc, char *argv[]) { int j, r, nloops; unsigned int seed; if (argc != 3) { fprintf(stderr, "Usage: %s <seed> <nloops>\n", argv[0]); exit(EXIT_FAILURE); } seed = atoi(argv[1]); nloops = atoi(argv[2]); srand(seed); for (j = 0; j < nloops; j++) { r = rand(); printf("%d\n", r); } exit(EXIT_SUCCESS); }
另外参见
drand48(3),随机(3)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。