mer*_*011 4 c random distribution
该手册页声称C标准库中的随机函数"返回0到RAND_MAX之间的值".
不幸的是,它没有说明这个随机函数的分布是什么.根据经验,我们可以测量它是统一的,但是没有文档,我无法确定它在应用程序中使用它时永远不会改变.
分发是否记录在何处?
C标准和POSIX规范都没有为random()或定义分发rand().我检查的一些系统的联机帮助页似乎也没有定义.
我认为,使用你遇到的计算机,random()并且rand()会产生随机数累积到(近似)均匀分布是非常安全的,但如果你不确定,你可以凭经验测试.
一般来说,我认为如果你承诺在一个范围内生成一个随机数,就会假设(当数量变为无穷大时)它们应该累积到一个均匀分布,否则你会失去一些随机性(熵丢失).根据我的经验,你唯一一次提到一个随机数生成器的分布是因为它不是统一的(例如,它们可能会告诉你某些特定的PRNG会根据正态分布产生随机数).
在验证我的假设时,我遇到了一个POSIX系列函数,这些函数被定义为以统一分布生成随机数:
名称
drand48,erand48,jrand48,lcong48,lrand48,mrand48,nrand48,seed48,srand48 - 生成均匀分布的伪随机数
概要
Run Code Online (Sandbox Code Playgroud)#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,但已被移植到其他系统 - 它被定义为产生均匀分布.
| 归档时间: |
|
| 查看次数: |
1703 次 |
| 最近记录: |