카테고리 없음

421번 강화를 실패하는 경우의 수 구하기 (feat. c++)

개발자_이훈규 2021. 9. 16. 16:55

커뮤니티에 올라왔길래 한 번 짜봤다.

#include <random>

// 5% 강화를 421번 연속으로 실패할 경우의 수를 측정하는 것

const int FAIL_ENFO_COUNT = 421;

// random init
random_device rd;
mt19937_64 mt(rd());
bernoulli_distribution isEnforce(0.05);     // 베르누이 확률


// init
uint tryCnt = 0;                             // 총 시도 횟수
double totalEnfoCnt = 0;                     // 총 강화 횟수

while (1) {
    tryCnt++;                               // 시도 횟수 증가

    int failCnt = 0;                        // 강화 실패 횟수
    while(FAIL_ENFO_COUNT > failCnt) {
        totalEnfoCnt++;                     // 총 강화 횟수 증가
        if (isEnforce(mt)) {                // 강화 성공여부
            break;
        }

        failCnt++;
    }

    if (FAIL_ENFO_COUNT == failCnt) {       // 421번 다 돌았는지 확인
        break;
    }
}

cout << "try count : " << tryCnt << endl;
cout << "total enforce count : " << totalEnfoCnt << endl;

돌려보니 5분인가 걸렸고 결과는 아래와 같습니다

try count : 814408499
total enforce count : 1.62884e+10


근데 사실 total enforce count는 필요 없는 숫자입니다. 왜냐하면 내가 강화를 시도하는 14억명 중에 연속으로 실패하는 한 사람이기 때문이죠.
그래서 8.1억 명중에 1명의 확률로 내가 걸린겁니다..?

 

Reference

랜덤함수 사용 - https://jeunjeun.tistory.com/28