毕竟,它们似乎优于标准libc rand()。我错过了什么吗?

(我花了一些时间在网上搜索此内容,而我能找到的该问题的另一个实例是在分配偏见的背景下,未得到解答。)

rand()和drand48()的手册页也似乎不一致。第一个建议第二个,第二个指出它已经过时,应该使用第一个。 (不过,公平地说,很多了解PRNG背后的数学知识的人对于这些功能的手册页有疑问,因为它们的用词不当,在某些情况下甚至是错误的。)

不过,我找不到“过时”状态的理由。

最佳答案

我系统上的手册页(来自Linux man-pages project说:



SVID 3于1989年出版。

SVID 4(链接为720页的PDF),于1995年发布,文档drand48erand48lrand48nrand48mrand48jrand48srand48seed48lcong48像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/

10-10 12:25