据我所知,rand()不会产生统一的随机分布。什么功能/算法允许我这样做?我不需要加密随机性,只需要统一的随机分布。最后,哪些库提供这些功能? 谢谢!
答案 0 :(得分:2)
这是一篇用C#编写的文章和stand-alone random number generator。代码非常小,可以轻松移植到C ++等。
每当这个主题出现时,有人会回答您不应该使用自己的随机数生成器,但应该将其留给专家。我回答说你不应该提出自己的算法。把它留给专家,因为它确实非常微妙。但是拥有自己的实现是可以的,甚至是有益的。这样你就可以知道正在做什么,并且可以跨语言或平台使用相同的方法。
该文中的算法由随机数生成的顶级专家George Marsaglia提供。即使代码很小,该方法仍然适用于标准测试。
答案 1 :(得分:2)
BSD random()
函数(包含在POSIX / SUS的XSI选项中)几乎普遍可用,并且在大多数系统上都比rand
好得多(rand
实际使用的random
除外{{1}} {1}}因此它们都非常好。)
如果你更愿意走出系统库,这里有一些关于你选择的好信息:
http://guru.multimedia.cx/category/pseudo-random-number-generators/
(来自FFmpeg成名的Michael Niedermayer。)
答案 2 :(得分:2)
rand()
生成统一(伪)随机分布。
C standard(3.7 MB PDF)第7.20.2.1节中的实际要求是:
rand 函数计算一系列伪随机整数 范围0到 RAND_MAX 。
其中RAND_MAX至少为32767.这无疑是模糊的,但意图是它给你一个统一的分布 - 实际上,这就是实现的实际做法。
该标准提供了一个示例实现,但不要求C实现使用它。
在实践中,当然有更好的随机数生成器。 rand()
的一个特定要求是它必须为给定的种子(srand()
的参数)生成完全相同的数字序列。您的描述并未表明这对您来说是个问题。
一个问题是rand()
为您提供固定范围内的均匀分布数字。如果你想要不同范围内的数字,你必须做一些额外的工作。例如,如果RAND_MAX是32767,那么rand()
可以产生32768个不同的值;你不能在不丢弃某些值的情况下得到0..9范围内的随机数,因为没有办法将这些32768个不同的值均匀分配到10个相同大小的桶中。
其他PRNG可能会给你提供比rand()
更好的结果,但它们仍然可能会遇到同样的问题。
像往常一样,comp.lang.c FAQ比我更好地回答这个问题;见问题13.15至13.21。
答案 3 :(得分:0)