커뮤니티에 올라왔길래 한 번 짜봤다.
#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