JS의 Monty-Hall 문제 시뮬레이션
11326 단어 programmingjavascriptmathematics
플레이
만약 네가 몬티홀 문제를 모른다면, 이것은 매우 유명한 수학 문제이다. 그의 이름은 텔레비전 게임 프로그램의 사회자 Monty Hall에서 유래한 것이다.이 프로그램은 Let's Make a Deal으로 시청자 중에서 뽑은'거래원'이 진행자와 거래하는 게임을 다루고 있다.
통상적으로 거래자는 특정한 상품을 받고 그것을 다른 물건과 교환하고 싶은지 물어본다.주인만 아는 것이 무엇인지, 그리고 보통 커튼, 문, 상자 등 뒤에 숨어 있는 것들.
그 중 한 게임에서 거래자는 세 개의 문을 닫았다.그 중 한 대의 차 뒤에는 새 차 한 대가 있고, 나머지 두 대의 차 뒤에는 'zonks' 라는 가치가 없는 물건이 있다.
몬티는 거래원에게 그 중 하나를 선택하라고 요구했다.
거래자가 선택을 했을 때, 몬티는 계속 앞으로 걸어가서 남은 두 개의 문 중 하나를 열었다. 그는 거기에 문이 있다는 것을 알았다.
이것은 이 거래원에게 아직 열리지 않은 두 개의 문을 남겼는데, 하나는 뒤에 차가 있고, 다른 하나는 zonk이다.
중요한 점이 왔다. 이때 몬티는 거래자에게 그가 최초의 선택을 바꿀 수 있다고 말했다.
문제는 현재 거래자들에게 가장 좋은 전략은 무엇입니까?그는 최초의 선택을 보류해야 합니까? 그는 다른 문을 선택해야 합니까? 아니면 그가 어떤 문을 선택해야 하는지도 중요합니까?
만약 답이 명백하다면 이것은 유명한 수학 문제가 되지 않을 것이다. 그러므로 나는 답을 주기 전에 두 번 더 고려할 것을 건의한다.
You should always change your initial selection to the other unopened doors!
처음 선택한 차문을 바꾸는 것은 이 차를 이길 수 없지만, 거래자에게 더 높은 우승 기회를 줄 것이다.만약 그가 이 게임을 1조 번 하려고 한다면, 이 전략은 그에게 손실이 아니라 더 많은 승리를 가져다 줄 것이다.
확률
왜 선택을 바꾸는 것이 항상 더 좋아요?언뜻 보기에는 상식에 어긋나는 것 같지만, 우리는 이 점을 분명히 하고, 자바스크립트로 이 게임을 시뮬레이션해서 이 점을 증명할 것이다.
보통 사람들이 가장 좋은 전략과 승리의 가능성을 물었을 때 두 가지 답이 있다.
You should always change your initial selection to the other unopened doors!
왜 선택을 바꾸는 것이 항상 더 좋아요?언뜻 보기에는 상식에 어긋나는 것 같지만, 우리는 이 점을 분명히 하고, 자바스크립트로 이 게임을 시뮬레이션해서 이 점을 증명할 것이다.
보통 사람들이 가장 좋은 전략과 승리의 가능성을 물었을 때 두 가지 답이 있다.
네, 답은 이 두 개가 아니에요.다른 골키퍼들의 66.6% 승리 기회로 몬티가 열어놓은 모든 골키퍼의 승리 기회와 자신만의 승리 기회를 집중적으로 전환시키는 것이 좋다.
만약 우리가 게임 설정을 열 문, 한 대의 차, 아홉 개의 zonks로 바꾸면 이 점은 더욱 분명해질 것이다.거래자는 그 중 한 개의 문을 선택했다. 몬티는 나머지 아홉 개의 문 중 여덟 개의 문을 열었다. 그는 이 안에 zonk가 있다는 것을 알았다.아직 두 개의 문이 열리지 않았다.
최초로 선정된 문은 10퍼센트의 승리 기회를 대표한다. 왜냐하면 열지 않은 10개의 문이 있기 때문에 어느 문에나 적용된다.몬티가 다른 여덟 개의 문을 열었을 때, 그는 거래원이 처음 선택한 문을 만질 수 없었기 때문에, 몬티는 그것들에 대한 어떤 정보도 주지 않았지만, 그는 모든 남은 문에 대한 정보를 주었다.
이 차는 여덟 개의 열려 있는 문 뒤에 있지 않다는 것은 몬티가 처음에 선택한 문을 떠나야 하기 때문에 나머지 아홉 개만 관심을 가질 수 있다는 것을 의미한다.이 차를 이길 확률은 모든 문을 열 확률의 합계와 나머지 열리지 않은 문과 처음에 선택한 문을 이길 확률의 합계, 즉 (8+1)x10%, 즉 90%이다.차 한 대를 이길 기회가 매우 크지 않습니까?
게임은 일반적으로 두 가지 가능한 장면만 있다.
간단하게 말하면 초선 승리의 확률은 시종
1:<number of doors>
과 같고, 그 어떠한 다른 문 뒤에서도 100% (즉 <number of doors>-1:<number of doors>
) 이다.몬티는 거래자에게 zonks를 포함하는 모든 문을 알려주었지만, 분명히 승리의 기회는 그 문에 집중되었다.모방하다
이 점에서, 너는 여전히 '나는 너를 믿지 않는다. 이것은 매우 이상하다' 는 상태에 있을 것이다. 알겠다.하지만 이 게임을 가상적으로 해서 진정한 결과를 봅시다.우리는 그것을 백만 번 놀게 하기 때문에, 우리는 그것이 정말 우리가 묘사한 것처럼 일한다고 말할 수 있다.코드 편집기를 시작해서 JS 기술을 털어냅시다.
N 게이트 게임
텔레비전의 게임은 세 개의 문이 있지만, 우리는 더 많은 게임이 거래자에게 더 높은 우승 기회를 준다는 것을 증명하기 위해 임의의 문을 열고 싶다.따라서 게임은 numberOfDoors
을 입력하는 함수가 될 것이다.
function playGame(numberOfDoors){//...}
먼저 해야 할 일은 문을 만드는 표시다.우리는 하나의 그룹을 사용할 것이다.우리는 길이가 문수와 같은 그룹을 만들어야 한다.
const doors = new Array(numberOfDoors);
지금 우리는 zonks를 모든 문 위에 놓아야 한다. 하나를 제외하고, 우리는 차 한 대를 놓아야 한다.잔크는 false
, 카는 true
으로 표시한다.내가 할 일은 존스를 모든 문 뒤에 두는 거야.
doors.fill(false);
그리고 나는 무작위 문 색인을 선택한 다음zonk를 차로 전환할 것이다.안녕히 계세요.
const carIndex = Math.floor(Math.random() * numberOfDoors);
doors[carIndex] = true;
지금은 거래자들이 그중의 문을 선택할 때다.
const traderSelection = Math.floor(Math.random() * numberOfDoors);
몬티의 차례가 왔다. 그는 모든 문을 열 것이지만, 거래자가 선택한 문과 다른 문이었다.몬티는 차가 어디에 있는지, zonks가 어디에 있는지 알고 있기 때문에, 자동차가 열리지 않도록 다음과 같은 절차를 밟아야 한다. 만약 거래원이 zonks가 있는 문을 선택했다면, 그는 반드시 모든 다른 문을 열어야 하지만, 차가 있는 문을 제외해야 한다.
let remainingDoorsIndex;
if(traderSelection !== carIndex){
remainingDoorsIndex = carIndex;
}
그러나 만약에 거래자가 진정으로 차가 있는 문을 선택한다면 몬티는 냉정함을 유지하고 그 중의 한 문을 무작위로 닫고 모든 다른 문을 열 수 있다. 왜냐하면 그는 모든 문 뒤에 zonks가 있다는 것을 알고 있기 때문이다.
else {
remainingDoorsIndex = Math.floor(Math.random() * (doorsNumber - 1));
if(remainingDoorsIndex >= traderSelection){
remainingDoorsIndex++;
}
}
우리는 남은 문을 무작위로 선택할 수 있는 방법이 많지만, 여기는 모든 문을 다시 인덱스하고, 거래자가 선택한 문을 무시합니다.
우리가 가장 좋은 전략은 문을 바꾸는 것이라고 말했기 때문에 마지막 단계는 다른 문을 선택하는 것이다.
const price = doors[remainingDoorsIndex];
return price;
만약에'시종일관 전환'전략이 새 차를 몰고 집으로 돌아간다면 우리의 함수 playGame
은 true
으로 돌아오거나 거래자가 실패할 때 false
으로 돌아간다.
무한대까지 놀았어요.
지금 우리의 전략이 오랜 시간 동안 확실히 효과가 있다는 것을 확보하기 위해서 우리는 여러 번 놀아야 한다. 나는 여러 번 말한다.우리가 많이 놀수록 예상한 확률에 가까워진다.백만 번이면 우리의 여러 가지 요구를 충족시킬 수 있을 뿐만 아니라, 당신의 브라우저에 불이 붙지 않을 것이다.
playSeries(numberOfGames, numberOfDoors){
let wins = 0;
for(let i = 0; i < numberOfGames; i++){
if(playGame(numberOfDoors)){
wins++;
}
}
const winsPercentage = wins / numberOfGames * 100;
console.log(`Games won: ${wins} = ${winsPercentage}%`);
}
우리 세 개의 문 놀이를 해 봅시다.
const MANY_GAMES_CONSTANT = 1000000;
playSeries(MANY_GAMES_CONSTANT, 3);
// Result around 66%
지금은 10문과 100문이 있다.
playSeries(MANY_GAMES_CONSTANT, 10);
// Result around 90%
playSeries(MANY_GAMES_CONSTANT, 100);
// Result around 99%
쿨, 보아하니 우리는 우리의 가설을 증명한 것 같다.'항상 전환'전략이 가장 좋다!너는 여전히 믿지 못할지도 모르지만, 그것은 바로 네 앞에 있다.
이 글을 좋아하셨으면 좋겠습니다. 다음은 한 지역의 모든 코드입니다.
Reference
이 문제에 관하여(JS의 Monty-Hall 문제 시뮬레이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/bambusekd/monty-hall-problem-simulation-in-js-5cl2
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
function playGame(numberOfDoors){//...}
const doors = new Array(numberOfDoors);
doors.fill(false);
const carIndex = Math.floor(Math.random() * numberOfDoors);
doors[carIndex] = true;
const traderSelection = Math.floor(Math.random() * numberOfDoors);
let remainingDoorsIndex;
if(traderSelection !== carIndex){
remainingDoorsIndex = carIndex;
}
else {
remainingDoorsIndex = Math.floor(Math.random() * (doorsNumber - 1));
if(remainingDoorsIndex >= traderSelection){
remainingDoorsIndex++;
}
}
const price = doors[remainingDoorsIndex];
return price;
playSeries(numberOfGames, numberOfDoors){
let wins = 0;
for(let i = 0; i < numberOfGames; i++){
if(playGame(numberOfDoors)){
wins++;
}
}
const winsPercentage = wins / numberOfGames * 100;
console.log(`Games won: ${wins} = ${winsPercentage}%`);
}
const MANY_GAMES_CONSTANT = 1000000;
playSeries(MANY_GAMES_CONSTANT, 3);
// Result around 66%
playSeries(MANY_GAMES_CONSTANT, 10);
// Result around 90%
playSeries(MANY_GAMES_CONSTANT, 100);
// Result around 99%
Reference
이 문제에 관하여(JS의 Monty-Hall 문제 시뮬레이션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/bambusekd/monty-hall-problem-simulation-in-js-5cl2텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)