RAND - Linux手册页

时间:2019-08-20 18:01:22  来源:igfitidea点击:

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)。

InterfaceAttributeValue
rand(),rand_r(),srand()Thread safetyMT-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/