首页  >  文章  >  后端开发  >  为什么 `rand() % 14` 在 Apple 系统上只返回 6 或 13?

为什么 `rand() % 14` 在 Apple 系统上只返回 6 或 13?

Susan Sarandon
Susan Sarandon原创
2024-11-24 20:59:21807浏览

Why Does `rand() % 14` Only Return 6 or 13 on Apple Systems?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn