2011-09-14 67 views
1

据我所知rand()不会产生均匀的随机分布。什么函数/算法可以让我这样做?我不需要密码随机性,只需要一个统一的随机分布。最后,什么库提供这些功能? 谢谢!什么是rand()的合适替代品?

+0

你需要像'unidrnd'这样的东西,请参阅http://octave.sourceforge.net/octave/function/unidrnd.html ..还有一个C++ API,我猜想,试着挖出代码:) – 2011-09-14 18:54:53

回答

2

rand()确实产生一个统一的(伪)随机分布。

实际需求,从C standard(3.7 MB PDF),第7.20.2.1,是:

兰特函数计算伪随机整数的序列在 范围为0〜RAND_MAX

其中RAND_MAX至少为32767.这是公认的含糊不清,但意图是它给你一个统一的分布 - 实际上,这就是实现实际做的。

该标准提供了一个示例实现,但C实现不需要使用它。

实际上,那里肯定有更好的随机数生成器。 rand()的一个具体要求是它必须产生与给定种子完全相同的数字序列(参数为srand())。您的描述并不表示这对您会造成问题。

一个问题是,rand()给你在一个固定的范围内统一分布的数字。如果你想要不同范围的数字,你必须做一些额外的工作。例如,如果RAND_MAX是32767,则rand()可以产生32768个不同的值;您不能在0..9范围内获得随机数字而不会放弃某些值,因为无法将这些32768个不同值均匀分配到10个相同大小的桶中。

其他PRNGs可能会给你比rand()更好的结果,但他们仍然可能会受到同样的问题。

像往常一样,comp.lang.c FAQ比我做得更好;见问题13.15至13.21。

+0

downvoter会照顾评论吗? –

2

这是一篇用C#编写的文章和stand-alone random number generator。代码很小,很容易移植到C++等。

每当有这个问题出现时,有人回应说,你不应该使用你自己的随机数发生器,但应该留给专家。我回应说,你不应该拿出你自己的算法。把它留给专家,因为它确实非常微妙。但它可以,甚至有利于你自己的实现。这样你就知道正在做什么,并且你可以在不同的语言或平台上使用相同的方法。

该文章中的算法由随机数生成中的顶级专家George Marsaglia提供。即使代码很小,该方法也能很好地适用于标准测试。

2

的BSD random()功能(包含在POSIX/SUS的XSI选项)几乎是普遍可用,比rand在大多数系统更好的(除了一些地方rand实际使用random,因此他们都还不错)。

如果你宁愿去系统库外,这里是你的选择一些好的信息:

http://guru.multimedia.cx/category/pseudo-random-number-generators/

(从FFmpeg的名声迈克尔Niedermayer)