Рубрики
Без рубрики

Моделирование проблемы Монта Холл в JS

Игра Если вы не знаете проблему Монты Холл, это довольно известная математическая проблема, … Помечено JavaScript, математика, программирование.

Если вы не знаете проблему Монты Холл, это довольно известная математическая проблема, что имела имя после просмотра телевизионной игры Show Host Монты Холл Отказ Шоу называлось Давайте сделаем сделку И вовлечены в игры, в которых «трейдеры», выбранные члены из зрителей, делали сделки с хозяином.

Обычно трейдер получил определенный приз и спросил, если он хочет обменять его за что-то еще. То, что только хост знал, что было, и что обычно скрывалось за некоторыми занавесом, двери, в коробке и т. Д.

В одной из игр, трейдер был представлен с тремя закрытыми дверями. За одним из них был совершенно новый автомобиль, за оставшимися двумя, были «Zonks» – предметы без ценности.

Трейдер попросил Монти выбрать одну из дверей.

Когда трейдеров сделал свой выбор, Монти пошел вперед и открыл одну из двух оставшихся дверей, где он знал, что там был Zonk.

Это оставило трейдера с двумя ненушеными дверями, одним с автомобилем позади него, один с Zonk.

И вот приходит решающая часть – в этот момент Монти предложил трейдеру, что он может изменить свой первоначальный выделение двери.

И вопрос в том – какая лучшая стратегия трейдера в данный момент? Должен ли он сохранять первоначальный выбор, должен ли он пойти на другие двери или даже не имеет значения, какие двери он выбирает?

Если ответ был очевиден, это, вероятно, не стало известной математической проблемой, поэтому я рекомендую думать об этом дважды, прежде чем сказать ответ …

Вы всегда должны изменить свой первоначальный выбор на другие ненужные двери!

Изменение начального выбора дверей не гарантирует выиграть автомобиль, но она даст трейдера гораздо более высоким шансом выиграть. Это означает, что если он должен был сыграть в эти игры триллионные времена, эта стратегия приведет его больше победы, чем убытки.

Как приходит всегда лучше изменить выбор? Сначала он может показаться противоимибирательным, но мы сделаем это понятно, а также доказать его по моделированию этой игры в JavaScript!

Обычно есть два ответа, когда вы спрашиваете людей, что является лучшей стратегией и какова вероятность выигрыша для него:

  • Неважно, если я изменил выбор, я выбираю из двух дверей, так что это 50% -50%
  • Лучше переключиться, вероятность того, что автомобиль стоит за дверями, которые я выбрал изначально, составляет всего 33,3%, поскольку я выбирал из трех дверей, теперь есть только два из них, поэтому остальные двери получают 50% шансов выиграть

И да, ответ ни один из этих двух. Лучше переключаться, потому что другие двери представляют собой 66,6% шансов выиграть, в конечном итоге «концентрируясь» вероятность победы от всех дверей, открытых Монти и собственным шансом на победу.

Это становится гораздо яснее, если мы изменим настроить игру до десяти дверей, одну машину, девять Zonks. Трейдер выбирает одну из дверей, Монти открывает восемь из девяти оставшихся дверей, где он знает, что есть Zonk. Опять же, два двери остаются неоткрынными.

Первоначальные выбранные двери представляют собой 10% шанс выигрыши, так как есть 10 ненужных дверей, которые применяются к любой из дверей. Когда Монти открывает восемь других дверей, он не может прикоснуться к первоначально выбранным дверям трейдером, поэтому он не дает никакой информации о них, но то, что он дает, это информация обо всех остальных дверях.

Автомобиль не стоит за любым из восьми открытых дверей, что означает, что есть довольно высокая вероятность того, что она стоит за оставшимися дверями, поскольку Монти было вынуждено оставить только один из выбранных дверей, и он мог бы только заботиться о оставшихся девяти. И шанс выиграть автомобиль равен сумме шансов всех открытых дверей, плюс оставшихся неоткрытых и не изначально выбранных дверей, то есть (8 + 1) х 10%, что составляет 90%. Довольно хороший шанс выиграть машину, не так ли?

Всегда есть только два возможных сценария для игры:

  1. Трейдер ударил двери с автомобилем позади них в качестве своего первоначального отбора, в этом случае Монти знает, что за всеми другими дверями есть Zonks, поэтому он может оставить кого-либо из них неоткрытое
  2. Трейдер ударил двери с Zonk позади них, когда его первоначальный выбор, в этом случае Монти должен покинуть двери с помощью автомобиля позади неясни.

Чем больше дверей вы добавляете, тем больше шансов выиграть, так как Монти всегда открывает все двери, кроме одного трейдера, изначально выбранного и другого.

Проще говоря, первоначальный выбор всегда имеет шанс выиграть равное 1: <Количество дверей> И вероятность того, что оно за любыми другими дверями – остальные до 100% (что это <количество дверей> -1: <количество дверей> ). И, как Монти говорит трейдеру обо всех дверях, которые содержат Zonks, но одно, понятно, что шанс победы сосредоточен в этом.

На данный момент вы все равно можете быть в точке «Я не верю вам, это странно», и я тебя забираю. Но эй, давайте играть в игру практически и увидеть реальные результаты. И давайте сыграем его миллион раз, поэтому мы действительно можем сказать, что это работает как мы описали. Давайте выстрелим некоторым кодовым редактором и пыль от наших навыков JS.

Игра N Двери

Игра в телевизоре была сыграна с тремя дверями, но мы хотим играть с любым количеством дверей, чтобы доказать, что игра с большим количеством дверей дает трейдеру более высоким шансом на победу. Поэтому игра будет функцией с одним входом Numberofdoors Отказ

function playGame(numberOfDoors){//...}

Во-первых, что нужно сделать, это создать представление дверей. Мы будем использовать для этого массив. Нам нужно создать массив длины, равной количеству дверей.

const doors = new Array(numberOfDoors);

Теперь нам нужно размещать Zonks во всех дверях, кроме одного, где мы разместим машину. Zonk будет представлен ложь Значение и автомобиль от правда Отказ То, что я буду делать, это поместить Zonks за всеми дверями.

doors.fill(false);

И тогда я выберу случайный дверной индекс и выключите Zonk для автомобиля. Скажи пока до Zonk, и приветствую новую яркую машину!

const carIndex = Math.floor(Math.random() * numberOfDoors);
doors[carIndex] = true; 

Теперь пришло время трейдеру выбрать одну из дверей.

const traderSelection = Math.floor(Math.random() * numberOfDoors);

Монта Монти – он собирается открыть все двери, но тот, который выбрал трейдер и друг друга. Монти знает, где машина и где Zonks, поэтому ему нужно действовать следующим образом, чтобы не раскрыть машину – если трейдер выбрал двери с Zonk, он должен открыть все остальные двери, но тот, кто с автомобилем в нем.

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 вернется истинный Если стратегия «Всегда переключатель» привела к вождению домой в новой машине или ложь когда трейдер проиграл.

Игра до бесконечности

Теперь, чтобы убедиться, что наша стратегия действительно работает в течение длительного времени, нам нужно играть в игру много И я имею в виду много раз. Чем больше мы играем, тем ближе к ожидаемой вероятности мы получим. Миллион раз будет достаточно, чтобы удовлетворить требование «много многих» для наших целей и не устанавливать ваш браузер в огонь.

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%

Круто, похоже, мы доказали нашу гипотезу, что стратегия «Всегда переключатель» является лучшим! Возможно, вы все равно не верите, но вот это, JS прямо на вашем лице.

Надеюсь, вы наслаждались статьей, и вот все код в одном месте:

Оригинал: “https://dev.to/bambusekd/monty-hall-problem-simulation-in-js-5cl2”