stdlib中random()的分布是什么?

mer*_*011 4 c random distribution

该手册页声称C标准库中的随机函数"返回0到RAND_MAX之间的值".

不幸的是,它没有说明这个随机函数的分布是什么.根据经验,我们可以测量它是统一的,但是没有文档,我无法确定它在应用程序中使用它时永远不会改变.

分发是否记录在何处?

Gre*_*ica 8

C标准和POSIX规范都没有为random()或定义分发rand().我检查的一些系统的联机帮助页似乎也没有定义.

我认为,使用你遇到的计算机,random()并且rand()会产生随机数累积到(近似)均匀分布是非常安全的,但如果你不确定,你可以凭经验测试.

一般来说,我认为如果你承诺在一个范围内生成一个随机数,就会假设(当数量变为无穷大时)它们应该累积到一个均匀分布,否则你会失去一些随机性(熵丢失).根据我的经验,你唯一一次提到一个随机数生成器的分布是因为它不是统一的(例如,它们可能会告诉你某些特定的PRNG会根据正态分布产生随机数).

编辑(POSIX)

在验证我的假设时,我遇到了一个POSIX系列函数,这些函数被定义为以统一分布生成随机数:

名称

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);
Run Code Online (Sandbox Code Playgroud)

FreeBSD的联机帮助页drand48确实注意到它们不具有加密安全性,arc4random()建议用于加密应用程序.arc4random()来自BSD,但已被移植到其他系统 - 它被定义为产生均匀分布.