C rand()缺乏随机性

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

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

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

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

而不是使用rand()%2 ,尝试rand()>(RAND_MAX/2) 。 您只能假设rand()在区间[0, RAND_MAX]上是统一的。

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

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

从C99标准:

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

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

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

rand()众所周知。 random()有点好(有时),但drand48()和它的家族要好得多。

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

好吧,你可以使用Algorithms for Mersenne Twister或WELL。 WELL的代码在这里(我没有足够的声誉) http://i.stack.imgur.com/q6VPL.png 在此处输入图像描述