하도 로수붐티 로수붐티 하길래 확률을 한번 구해봤습니다. 비쥬얼 스튜디오를 키고 30분 정도 코딩을 해서 완성시켰습니다.

가정 
1. 수수께끼는 2장 가지고 있고 멀리건으로 잡고간다.
2. 보쓴꼬, 단검 곡예사, 병력소집, 비밀지기를 멀리건에서 잡는다.(총 8장)
3. 수수께끼가 등장할 때 비밀은 걸려있지 않고, 덱에 남아있는 비밀이 1개씩 걸린다.

이렇게 가정하고 코딩으로 10만번 반복시켜서 확률을 구했습니다.

선턴 1.877%
후턴 2.816%

생각보다 확률이 적게 나왔네요. 아마 로수붐티가 임팩트가 있어서, 사람들이 과대 평가 하는게 아닐까요? 자기가 한번이라도 당하면 그 충격을 잊지 못하는거죠.

차원문도 마찬가지 아닐까 생각이 듭니다.

코딩 첨부하니, 지적 해주시면 감사하겠습니다.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int DecideDeckOrder(int *deck);
int PushCard(int *deck, int number, int cardNumber);
int PrintDeck(int *deck);
int InitializationDeck(int *deck);
int Swap(int &a, int &b);
int MuliganDeck(int *deck, int checkTurn);
int CheckSecret(int *deck, int checkTurn);
int DeleteSecret(int *deck, int checkTurn, int secretNumber);
int CheckCard(int *deck, int cardNumber, int checkTurn);

int main()
{
srand(time(NULL));

int deck[30] = {0};
int i = 0, j = 0;
int checkSucess = 0;
int count = 0;

for(i = 0 ; i < 100000 ; i++){

checkSucess = 0;
InitializationDeck(deck);
DecideDeckOrder(deck);
MuliganDeck(deck, 0);
CheckSecret(deck, 0);
for(j = 6 ; j <= 9 ; j++){
if(CheckCard(deck, j, 0) == 0)
break;
else
checkSucess++;
}


if(checkSucess == 4)
count++;

}
printf("%.3lf%%n",(double)count/1000);

count = 0;

for(i = 0 ; i < 100000 ; i++){

checkSucess = 0;
InitializationDeck(deck);
DecideDeckOrder(deck);
MuliganDeck(deck, 1);
CheckSecret(deck, 1);
for(j = 6 ; j <= 9 ; j++){
if(CheckCard(deck, j, 1) == 0)
break;
else
checkSucess++;
}


if(checkSucess == 4)
count++;

}
printf("%.3lf%%n",(double)count/1000);

return 0;
}

int DecideDeckOrder(int *deck){

int i = 0;
int padding = 0;

PushCard(deck, 2, 1); // 비밀 5개
PushCard(deck, 2, 2);
PushCard(deck, 1, 3);
PushCard(deck, 1, 4);
PushCard(deck, 1, 5);
PushCard(deck, 1, 6); // 로데브
PushCard(deck, 2, 7); // 수수께끼
PushCard(deck, 1, 8); // 박사붐
PushCard(deck, 1, 9); // 티리온
PushCard(deck, 8, -1); // 보쓴꼬, 단검, 비밀지기, 신풀


return 0;
}

int PushCard(int *deck, int number, int cardNumber){

int i = 0;
int padding = 0;

while(i < number){
padding = rand()%30;
if(deck[padding] != 0){
i--;
}
else{
deck[padding] = cardNumber;
}
i++;
}

return 0;
}

int PrintDeck(int *deck){

int i = 0;
for(i = 0 ; i < 30 ; i++){
printf("%dn",deck[i]);
}

printf("n");

return 0;
}

int InitializationDeck(int *deck){
int i = 0;

for(i = 0; i < 30 ; i++){
deck[i] = 0;
}

return 0;
}

int MuliganDeck(int *deck, int checkTurn){

int i = 0;
int thirty[30] = {0};
int first = 0, second = 0, third = 0, forth = 0;

for(i = 0 ; i < 30 ; i++){
thirty[i] = i + 1;
}

first = thirty[rand()%26 + 3];
thirty[first - 1] = 0;

while(second == 0){
second = thirty[rand()%26 + 3];
}
thirty[second - 1] = 0;

while(third == 0){
third = thirty[rand()%26 + 3];
}
thirty[third - 1] = 0;
while(forth == 0){
forth = thirty[rand()%26 + 3];
}
thirty[forth - 1] = 0;

if(checkTurn == 0){

for(i = 0 ; i < 3; i++){
if(deck[i] >= 0 && deck[i] != 7){
if(i == 0)
Swap(deck[i], deck[first]);
else if(i == 1)
Swap(deck[i], deck[second]);
else if(i == 2)
Swap(deck[i], deck[third]);
}
}
}

else if(checkTurn == 1){

for(i = 0 ; i < 4; i++){
if(deck[i] >= 0 && deck[i] != 7){
if(i == 0)
Swap(deck[i], deck[first]);
else if(i == 1)
Swap(deck[i], deck[second]);
else if(i == 2)
Swap(deck[i], deck[third]);
else if(i == 3)
Swap(deck[i], deck[forth]);
}
}
}


return 0;
}

int Swap(int &a, int &b){

int temp = 0;

temp = a;
a = b;
b = temp;

return 0;
}

int CheckSecret(int *deck, int checkTurn){

int i = 0;

for(i = 0 ; i <= 4; i++){
DeleteSecret(deck, checkTurn, i + 1);
}

return 0;
}

int DeleteSecret(int *deck, int checkTurn, int secretNumber){

int i = 0;

if(checkTurn == 0){
i = 9;
while(i<30){
if(deck[i] == secretNumber){
deck[i] = -2;
break;
}
i++;
}
}
if(checkTurn == 1){
i = 10;
while(i<30){
if(deck[i] == secretNumber){
deck[i] = -2;
break;
}
i++;
}
}


return 0;

}

int CheckCard(int *deck, int cardNumber, int checkTurn){

int i = 0;
int turn = cardNumber - 1;

if(checkTurn == 0){
for(i = 0 ; i <= turn + 3 ; i++){
if(deck[i] == -2) // 수수께끼로 비밀 빠져나갈때
turn++;

if(deck[i] == cardNumber)
return 1;
}
}

if(checkTurn == 1){
for(i = 0 ; i <= turn + 4 ; i++){
if(deck[i] == -2) // 수수께끼로 비밀 빠져나갈때
turn++;

if(deck[i] == cardNumber)
return 1;
}
}

return 0;
}