这篇 man 手册声称 C 标准库中的 random 函数“返回介于0和 RAND_MAX 之间的值。”
不幸的是,它没有说明这个随机函数的分布情况。经验证,我们可以测量它是均匀的,但没有文档说明,我不能确定在应用程序中使用它时它永远不会改变。
这个分布是否有任何文档记录呢?
这篇 man 手册声称 C 标准库中的 random 函数“返回介于0和 RAND_MAX 之间的值。”
不幸的是,它没有说明这个随机函数的分布情况。经验证,我们可以测量它是均匀的,但没有文档说明,我不能确定在应用程序中使用它时它永远不会改变。
这个分布是否有任何文档记录呢?
random()
或rand()
的分布。我查阅的一些系统的man页面似乎也没有定义这个问题。我认为,在遇到的计算机上,可以非常安全地假设random()
和rand()
会产生随机数,这些随机数(大约)累积到均匀分布,但如果您不确定,可以进行经验测试。一般而言,如果承诺生成一个范围内的随机数,则默认情况下(当数量趋近于无穷大时),它们应该累积到均匀分布,否则您将失去一些随机性(熵的损失)。根据我的经验,仅当随机数生成器的分布与均匀分布不同(例如,他们可能告诉您某些特定的伪随机数生成器将按照正态分布生成随机数)时,才会提及随机数生成器的分布。在验证我的假设时,我发现了POSIX函数族,这些函数被定义为生成均匀分布的随机数:
NAME
drand48, erand48, jrand48, lcong48, lrand48, mrand48, nrand48, seed48, srand48 - generate uniformly distributed pseudo-random numbers
SYNOPSIS
#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);
FreeBSD的drand48
手册指出它们不具有加密安全性,并推荐使用arc4random()
进行加密应用。arc4random()
来自BSD,但已被移植到其他系统--它被定义为产生均匀分布。
random(void)
函数不是C标准的一部分。但是,(@nwellnhof!)它是POSIX标准的一部分。
它在glibc文档和POSIX中有记录。然而,没有任何发行版被这两个文本保证。
glibc:
long int random(void)
初步:|MT-Safe|AS-Unsafe锁|AC-Unsafe锁|请参阅第1.2.2.1节[POSIX安全概念],第2页。
此函数返回序列中的下一个伪随机数。返回值范围从0到2147483647。
NB: 暂时将此函数定义为返回
int32_t
值,以指示返回值始终包含32位,即使 long int 更宽。标准要求不同。用户必须始终注意32位限制。
POSIX:
random()函数使用非线性加法反馈随机数生成器,采用默认状态数组大小为31个长整型数,以返回在0到2^31-1范围内的连续伪随机数。该随机数生成器的周期约为16 x (2^31-1)。状态数组的大小决定了随机数生成器的周期。增加状态数组大小可以增加周期。lrand48
和相关函数:这些函数也被POSIX定义。函数
lrand48()
和nrand48()
返回非负长整型,在区间[0,2^31)上均匀分布。
rand()
函数。 - merlin2011random
是由POSIX标准化的。 - nwellnhof
rand()
。random()
是BSD的随机数函数:https://www.gnu.org/software/libc/manual/html_node/Pseudo_002dRandom-Numbers.html#Pseudo_002dRandom-Numbers - kfx