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 중국어 웹사이트의 기타 관련 기사를 참조하세요!