rand() % 14 之谜仅产生 6 或 13
程序员遇到了一个特殊问题,其中 rand() % 14 始终一致在他们的 C 程序中只返回 6 或 13。尽管多次运行该程序,这些值都是唯一的结果。
有问题的代码:
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; int main(int argc, const char * argv[]) { srand(time(NULL)); cout << rand() % 14; return 0; }
罪魁祸首:Apple 的 MCG 随机数生成器
根据维基百科,Apple 的 Marsaglia-Crépeau 随机数生成器使用的乘数(RNG) 是 16807。不幸的是,这个乘数可以被 7 整除。因此,srand() 之后生成的初始随机数仅具有一位模 14 的熵,将其限制为两个可能的值:6 或 13。
一个简单的解决方案
要避免这个问题,可以放弃srand() 之后立即生成一些随机数。通过这样做,后续随机数的熵会增加,从而允许更广泛的值。
这是修改后的代码:
int main(int argc, const char * argv[]) { srand(time(NULL)); // Discard the first few random numbers to eliminate the bias for (int i = 0; i < 10; ++i) rand(); cout << rand() % 14; return 0; }
通过丢弃前 10 个随机数,您有效地消除了 MCG RNG 有缺陷的乘数带来的偏差。
以上是为什么 `rand() % 14` 在 Apple 系统上只返回 6 或 13?的详细内容。更多信息请关注PHP中文网其他相关文章!