我使用rand()
生成0或1(rand() % 2
)。我正在使用当前时间(srand(time(NULL))
)播种它。
经过大量调试后,我意识到rand()
永远不会连续返回偶数(奇数)16次或更多次。
这是一个已知问题吗? C有更好的PRNG吗?
我使用Visual Studio 2010在Windows 7上运行。
答案 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