9

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

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

这是一个已知的问题?有没有 C 附带的更好的 PRNG?

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

4

4 回答 4

14

而不是使用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。

于 2012-07-10T17:00:41.143 回答
2

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

于 2012-07-10T17:08:44.500 回答
1

rand()是众所周知的吸。 random()好一点(有时),但drand48()它的家庭要好得多。

如果您需要比这更好,请查看 mersene twister 或其他 PRNG 库。或者查看 /dev/random 是否可以提供足够的数据来满足您的需求。

于 2012-07-10T16:55:00.950 回答
0

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

于 2013-08-24T10:56:28.900 回答