레이블이 구현인 게시물을 표시합니다. 모든 게시물 표시
레이블이 구현인 게시물을 표시합니다. 모든 게시물 표시

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