另一方面,这段代码:
rand()%6
通常被认为是一种不好的做法。rand() 的低位比高位的随机性要小得多。如果你这样做,你会得到更好的随机性:
(rand() >> 8)%6
例如。
编辑:
有关这方面的更多详细信息,请参阅此说明以及Dobbs 博士杂志的这篇文章,其中至少暗示了原因:
注意:请勿使用
y = rand() % M;
因为这侧重于 rand() 的低位。对于 rand() 通常是线性同余随机数生成器,低字节的随机性远低于高字节。事实上,最低位在 0 和 1 之间循环。因此 rand() 可能在偶数和奇数之间循环(试试看)。注意 rand() 不必是线性同余随机数生成器。完全允许它是没有这个问题的更好的东西。
东道主:
最重要的一点是,通常(线性同余)随机数生成器输出的低位是最不“随机”的。也就是说,低位中的模式是常见的。因此,您讨论中例行滚动的输出并不令人惊讶。此外,依靠高位来确定返回的整数是可以避免的。
例如,如果您想选择一个随机的“真”或“假”值,并且您使用了以下代码:
rand() % 2
然后你可能最终会看到结果的模式:
1,0,1,0,1,0,1,0,1,0(等)
这显然不是那么随机,但它是可能正在使用的线性同余生成器的一个属性。一个更好的方案(对于 C++)可能是使用Boost.Random库,它支持所有类型的可插拔随机生成器(包括没有这个缺陷的 Mersenne Twister)。