RANDOM_R - Linux手册页

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

Linux程序员手册 第3部分
更新日期: 2017-09-15

名称

random_r,srandom_r,initstate_r,setstate_r-可重入随机数生成器

语法

#include <stdlib.h>

int random_r(struct random_data *buf, int32_t *result);

int srandom_r(unsigned int seed, struct random_data *buf);

int initstate_r(unsigned int seed, char *statebuf,
                size_t statelen, struct random_data *buf);

int setstate_r(char *statebuf, struct random_data *buf);

glibc的功能测试宏要求(请参阅feature_test_macros(7)):

random_r(),srandom_r(),initstate_r(),setstate_r():

/ *自2.19开始的Glibc:* / _DEFAULT_SOURCE || / * Glibc版本

说明

这些函数是random(3)中描述的函数的可重入等效项。它们适用于多线程程序,其中每个线程都需要获得独立的,可再现的随机数序列。

random_r()函数类似于random(3),不同之处在于它不是在全局变量中维护状态信息,而是在buf指向的参数中使用状态信息,该参数必须事先由initstate_r()初始化。生成的随机数将在参数结果中返回。

srandom_r()函数类似于srandom(3),不同之处在于它为随机数生成器初始化种子,该种子的状态保持在buf指向的对象中,该对象必须事先由initstate_r()初始化而不是种子与全局状态变量关联。

initstate_r()函数类似于initstate(3),不同之处在于它会初始化buf指向的对象中的状态,而不是初始化全局状态变量。在调用此函数之前,必须将buf.state字段初始化为NULL。 initstate_r()函数在buf指向的结构内记录一个指向statebuf参数的指针。因此,只要buf仍在使用,就不应释放statebuf。 (因此,通常应将statebuf分配为静态变量,或使用malloc(3)或类似方法将其分配到堆上。)

setstate_r()函数类似于setstate(3),不同之处在于它修改buf指向的对象中的状态,而不是修改全局状态变量。状态必须首先使用initstate_r()初始化,或者是先前调用setstate_r()的结果。

返回值

所有这些函数成功均返回0。发生错误时,将返回-1,并设置errno以指示错误原因。

错误说明

EINVAL
小于8个字节的状态数组已指定给initstate_r()。
EINVAL
setstate_r()的statebuf或buf参数为NULL。
EINVAL
random_r()的buf或result参数为NULL。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
random_r(),srandom_r(),
initstate_r(),setstate_r()
Thread safetyMT-Safe race:buf

遵循规范

这些功能是非标准的glibc扩展。

BUGS

initstate_r()接口令人困惑。看来random_data类型是不透明的,但是该实现要求用户在调用之前将buf.state字段初始化为NULL或将整个结构归零。

另外参见

drand48(3),rand(3),随机(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/