2015년 6월 28일 일요일

몬티홀 문제 코딩 구현

확률에 관한 공부를 조금만 깊게 하면 한번쯤은 만나는 문제인듯 합니다.
몬티홀 게임, 몬티홀 딜레마 라고 불리는 이 문제의 법칙 및 순서는 아래와 같습니다.
  1. 각각의 3개의 문 뒤에는 염소 2마리, 자동차 1대 중 하나가 있다.
  2. 참가자는 하나의 문을 선택한다.
  3. 사회자는 선택되지 않은 문 중에 염소가 있는 문 하나를 공개한다.
  4. 참가자는 처음 선택한 문과 나머지 하나의 문 중에서 선택을 바꿀 기회를 얻는다.
  • 이러한 상황일 경우 바꾸는 것이 좋을 것인가? 그대로 선택하는 것이 좋을 것인가?


이 문제는 (적어도 저에게) 딜레마라는 문제 답게 이해하기 힘들었습니다.

이 문제는 사실 아주 쉬운 문제입니다.
  • 처음 고른 상품이 차 일 경우(1/3 확률) 사회자가 제외시킨 문을 제외하면 나머지는 무조건 염소
  • 처음 고른 상품이 염소 일 경우(2/3 확률) 사회자가 제외 시킨 문을 제외하면 나머지는 무조건 차

라는 결과가 나옵니다.

이 문제를 알려주셨던 선생님의 표현을 빌려 쓰자면, 사회자가 선택한 문의 확률이 흡수 되었다고 할 수 있습니다.


var i = 0;
var arr = ['goat','goat','goat'];
var success = 0;
var fail = 0;
for(i = 0;i<100000;i++,arr=['goat','goat','goat']){
	//자동차 랜덤 위치
	var car = Math.floor(Math.random()*3);
	arr[car] = 'car';
	
	//랜덤하게 선택
	var choice = Math.floor(Math.random()*3);
	
	
	//염소위치 알려줌
	do{	
		rm_index = Math.floor(Math.random()*3);
	}while(rm_index == car || rm_index == choice);


	//바꾼후 진행
	choice = 3-(rm_index+choice);
	
	if(arr[choice] == 'car'){
		success++;
	}
	else{
		fail++;
	}	
}

console.log("case : change")
console.log("success " + success);
console.log("fail " + fail);

결과는
success 33322
fail 66678
success 66660
fail 33340