>백엔드 개발 >C++ >Apple 시스템에서 `rand() % 14`가 6 또는 13만 반환하는 이유는 무엇입니까?

Apple 시스템에서 `rand() % 14`가 6 또는 13만 반환하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-24 20:59:21897검색

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 난수 생성기

Wikipedia에 따르면 Apple의 Marsaglia-Crépeau 난수 생성기가 활용하는 승수입니다. (RNG)는 16807입니다. 불행하게도 이 승수는 7로 나눌 수 있습니다. 결과적으로 srand() 이후에 생성된 초기 난수는 모듈로 14의 엔트로피 1비트만 보유하므로 가능한 두 값인 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의 결함 있는 승수로 인해 발생하는 편향을 효과적으로 제거할 수 있습니다.

위 내용은 Apple 시스템에서 `rand() % 14`가 6 또는 13만 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.