RANDOM - Linux手册页

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

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

名称

random, srandom, initstate, setstate-随机数生成器

语法

#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);

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

random(),srandom(),initstate(),setstate():

_XOPEN_SOURCE>= 500 || / * Glibc自2.19起:* / -_DEFAULT_SOURCE || / * Glibc版本

说明

random()函数使用非线性加法反馈随机数生成器,该生成器使用大小为31个长整数的默认表来返回从0到2 ^ 31-1范围内的连续伪随机数。此随机数生成器的周期非常大,大约16 *((2 ^ 31)-1)。

srandom()函数将其参数设置为将由random()返回的新的伪随机整数序列的种子。通过调用具有相同种子值的srandom()可重复这些序列。如果未提供种子值,则将自动为random()函数提供值1。

initstate()函数允许初始化状态数组状态以供random()使用。 initstate()使用状态数组n的大小来确定随机数生成器应使用的复杂程度-状态数组越大,随机数越好。状态数组n的大小的当前"最佳"值为8、32、64、128和256个字节。其他金额将四舍五入至最接近的已知金额。使用少于8个字节会导致错误。 seed是初始化的种子,它指定了随机数序列的起点,并提供了在同一点重新开始的信息。

setstate()函数更改random()函数使用的状态数组。状态数组状态用于生成随机数,直到下一次调用initstate()或setstate()为止。状态必须先使用initstate()初始化,或者是先前调用setstate()的结果。

返回值

random()函数返回0到(2 ^ 31)-1之间的值。srandom()函数不返回任何值。

initstate()函数返回一个指向先前状态数组的指针。错误时,将设置errno以指示原因。

成功时,setstate()返回一个指向先前状态数组的指针。错误时,它将返回NULL,并设置errno以指示错误原因。

错误说明

EINVAL
提供给setstate()的状态参数为NULL。
EINVAL
小于8个字节的状态数组已指定给initstate()。

属性

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

InterfaceAttributeValue
random(),srandom(),
initstate(),setstate()
Thread safetyMT-Safe

遵循规范

POSIX.1-2001,POSIX.1-2008、4.3BSD。

备注

在需要可重现行为的多线程程序中,不应使用random()函数。为此使用random_r(3)。

随机数的生成是一个复杂的话题。 《 C中的数字食谱:科学计算的艺术》(William H. Press,Brian P. Flannery,Saul A. Teukolsky,William T. Vetterling;纽约:剑桥大学出版社,2007年,第3版)对实用性进行了精彩的讨论。第7章(随机数)中的随机数生成问题。

有关更多理论性讨论的内容,其中也涉及许多实际问题,请参见Donald E. Knuth的《计算机编程艺术》,第2卷(Seminumical算法),第2版的第3章(随机数);马萨诸塞州雷丁:艾迪生·韦斯利出版公司,1981年。

BUGS

根据POSIX,initstate()应该在错误时返回NULL。在glibc实现中,(按指定)将errno设置为错误,但是该函数不会返回NULL。

另外参见

getrandom(2),drand48(3),rand(3),random_r(3),srand(3)

出版信息

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