毕竟,它们似乎优于标准libc rand()。我错过了什么吗?
(我花了一些时间在网上搜索此内容,而我能找到的该问题的另一个实例是在分配偏见的背景下,未得到解答。)
rand()和drand48()的手册页也似乎不一致。第一个建议第二个,第二个指出它已经过时,应该使用第一个。 (不过,公平地说,很多了解PRNG背后的数学知识的人对于这些功能的手册页有疑问,因为它们的用词不当,在某些情况下甚至是错误的。)
不过,我找不到“过时”状态的理由。
最佳答案
我系统上的手册页(来自Linux man-pages project说:
SVID 3于1989年出版。
SVID 4(链接为720页的PDF),于1995年发布,文档drand48
,erand48
,lrand48
,nrand48
,mrand48
,jrand48
,srand48
,seed48
和lcong48
像POSIX一样,都没有提到它们过时。
POSIX(截至2013年)没有说明它们已过时,过时或过时。
我还没有找到SVID 3的副本,所以我不知道为什么它会宣布那些功能过时,但是显然稍后会重新考虑该决定。手册页中的语句似乎是过时的信息。我不会担心。
至于应该使用哪个函数,C标准rand()
函数是最可移植的(除非您重新编译与源代码不同的函数)。一些rand()
实现的质量很差,低序位以非常规则的模式重复;其他人稍微好一点。
如果您不需要高质量的伪随机数,则不妨使用rand()
(通过以合理的值(例如srand()
)调用srand(time(NULL))
进行播种。
如果您确实需要高质量的伪随机数,那么这些功能可能都不够好,例如,我建议您不要将它们中的任何一个用于加密。如果系统支持,则可以使用/dev/urandom
或/dev/random
。我听说过有关Mersenne Twister的好消息,但我缺乏进一步评论的专业知识。
(顺便说一句,如果您在Google搜索SVID,请注意Svið)。
关于c - 为什么drand48()和 friend 过时了?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25269428/