C rand()缺乏随机性

时间:2012-07-10 16:51:35

标签: c random

我使用rand()生成0或1(rand() % 2)。我正在使用当前时间(srand(time(NULL)))播种它。

经过大量调试后,我意识到rand()永远不会连续返回偶数(奇数)16次或更多次。

这是一个已知问题吗? C有更好的PRNG吗?

我使用Visual Studio 2010在Windows 7上运行。

4 个答案:

答案 0 :(得分:11)

不要使用rand()%2,请尝试rand()>(RAND_MAX/2)。您只能假设rand()[0, RAND_MAX]区间内保持统一。

编辑:这是Shahbaz在评论中提出的,我在发布此答案后才注意到这一点。

编辑:ArjunShankar根据我之前的措辞打电话给我:“rand()仅在区间[0,RAND_MAX]上指定为统一”

来自C99标准:

  

rand函数计算0到0范围内的伪随机整数序列   RAND_MAX。

从技术上讲,未指定均匀性(或等分布),但它是用于实施常用PRNG(例如Mersenne Twister)的事实上的标准。这是为了允许程序员轻松创建具有非均匀分布的自定义PRNG。如果没有此属性,程序员将被迫从头开始实现自定义PRNG。

答案 1 :(得分:2)

我建议使用更好的RNG。您正在Windows上运行,因此您可以使用rand_s:它是使用Windows加密RNG的Microsoft扩展。

答案 2 :(得分:1)

众所周知,

rand()很糟糕。 random()有点好(有时),但drand48()及其家庭要好得多。

在您需要更好的情况下,请查看mersene twister或其他PRNG库。或者检查/ dev / random是否可以提供足够的数据以满足您的需求。

答案 3 :(得分:0)

好吧,你可以使用Algorithms for Mersenne Twister或WELL。 WELL的代码在这里(我没有足够的声誉) http://i.stack.imgur.com/q6VPL.png enter image description here