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