什么是rand()的合适替代品?

时间:2011-09-14 18:48:26

标签: c random

据我所知,rand()不会产生统一的随机分布。什么功能/算法允许我这样做?我不需要加密随机性,只需要统一的随机分布。最后,哪些库提供这些功能? 谢谢!

4 个答案:

答案 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)