NAME drand48,erand48,jrand48,lcong48,lrand48,mrand48,nrand48,seed48,srand48 - 生成均匀分布伪随机数概要#include <stdlib.h>
double drand48(void); double erand48(unsigned short xsubi [3]); long jrand48(unsigned short xsubi [3]); void lcong48(unsigned short param [7]); long lrand48(void); long mrand48(void); long nrand48(unsigned short xsubi [3]); unsigned short * seed48(unsigned short seed16v [3]); void srand48(long seedval);
2 回答
random(void)
函数不是C标准的一部分 . 但是,(@ nwellnhof!)它是POSIX标准的一部分 .它记录在glibc documentation和POSIX中 . 但是,任何一种文本都不能保证分发 .
glibc的:
POSIX:
但是,如果您正在使用GLIBC,并且您希望标准保证的伪随机数函数在其范围内生成均匀分布的随机数,那么您可以使用SVID random functions,
lrand48
和朋友:从第330页起:
这些也是defined by POSIX .
C标准和POSIX规范都没有定义
random()
或rand()
的分布 . 我检查的一些系统的联机帮助页似乎也没有定义 .我认为用您遇到的计算机来假设
random()
和rand()
会产生随机数累积到(近似)均匀分布是非常安全的,但如果您不确定,可以凭经验测试 .一般来说,我认为如果你承诺在一个范围内生成 random 数字,则假设(当数字的数量变为无穷大时)它们应该累积到均匀分布,否则你会失去一些随机性(失去熵) . 根据我的经验,你唯一一次提到随机数生成器的分布是否是统一之外的东西(例如,他们可能会告诉你某些特定的PRNG会根据正态分布产生随机数) .
编辑(POSIX)
在验证我的假设时,我遇到了一个POSIX函数系列,这些函数被定义为以统一分布生成随机数:
double drand48(void);
double erand48(unsigned short xsubi [3]);
long jrand48(unsigned short xsubi [3]);
void lcong48(unsigned short param [7]);
long lrand48(void);
long mrand48(void);
long nrand48(unsigned short xsubi [3]);
unsigned short * seed48(unsigned short seed16v [3]);
void srand48(long seedval);
FreeBSD的manpage for drand48确实注意到它们不具有加密安全性,并且建议将arc4random()用于加密应用程序 .
arc4random()
来自BSD但已被移植到其他系统 - 它被定义为产生均匀分布 .