我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 是否可以提供足够的数据来满足您的需求。
好吧,您可以使用 Mersenne Twister 或 WELL 的算法。WELL 的代码在这里(我没有足够的声誉) http://i.stack.imgur.com/q6VPL.png