john1990_1 Ответов: 1

Как улучшить решение этой проблемы Монти Холла?


Я видел сложные решения, это простое решение (для постоянного переключения) и показал результат (2/3) выигрыша при переключении, не могли бы вы сказать мне, как мой код можно отредактировать, чтобы быть лучше, если это возможно? Понятно, что когда мы видим, что вероятность выигрыша игрока при переключении составляет (2/3), то остаток для того, чтобы не переключаться, равен 1-(2/3)=(1/3), или мы можем написать код для этого.

Это описание проблемы:
en.wikipedia.org/wiki/Monty_Hall_problem
youtube.com/watch?v=4Lb-6rxZxx0

Что я уже пробовал:

    int wins = 0;
    for (int i = 0; i < 1000000; i++)
    {
        if (alwaysSwitch())
        {
            wins++;
        }
    }
    MessageBox.Show(wins.ToString());
}

Random RN = new Random();

bool alwaysSwitch()
{
    int leftGoat = -1, rightGoat = -1, winDoor = -1;

    switch (RN.Next(3))
    {
        case 0: winDoor = 0; leftGoat = 1; rightGoat = 2; break;
        case 1: winDoor = 1; leftGoat = 0; rightGoat = 2; break;
        case 2: winDoor = 2; leftGoat = 0; rightGoat = 1; break;
    }

    int decision = RN.Next(3);

    if (leftGoat == decision)
    {
        rightGoat = -1;
    }

    if (rightGoat == decision)
    {
        leftGoat = -1;
    }

    if (winDoor == decision)
    {
        return false;
    }
    else
    {
        return true;
    }
}

Patrice T

Дайте ссылку на сайт этой проблемы.

john1990_1

https://en.wikipedia.org/wiki/Monty_Hall_problem
https://www.youtube.com/watch?v=4Lb-6rxZxx0

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

john1990_1

Спасибо, сделал.

Richard MacCutchan

Вы возвращаете истину, если выбор не является выигрышной дверью; разве это не должно быть наоборот? Кроме того, почему вы устанавливаете левую и правую Козлы на -1, если они выбраны, так как вы ничего не делаете с этими значениями?

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

1 Ответов

Рейтинг:
5

George Swan

Есть только один способ проиграть, если вы всегда меняете двери, и это выбрать выигрышную дверь изначально. Есть один шанс из трех сделать это. Так что шансы на победу при свопе равны 2/3. Если вы хотите смоделировать игру, вам нужно только беспокоиться о положении автомобиля. Что-то вроде этого.

class Program
   {
       private static readonly Random random = new Random();
       static void Main()
       {
           int totalWins = 0;
           int iterations = 20000;
           for (int i = 0; i < iterations; i++)
           {
               totalWins += Play();
           }
           Console.WriteLine("% wins is {0:0.0%}", (double)totalWins / iterations);
           Console.ReadLine();

       }
       public static int Play()
       {
           int initialChoice = random.Next(3);//make a choice
           int winningDoor = random.Next(3);//the car is here
           //simulate the host choosing a door to open
           int openedDoor;
           do
           {
               openedDoor = random.Next(3);
           }
           //host chooses to open a door that's not the winning door or the door already picked
           while (openedDoor == initialChoice || openedDoor == winningDoor);
           //make the final choice the remaining door
           int finalChoice = 3 - (openedDoor + initialChoice);
           return finalChoice == winningDoor ? 1 : 0;
       }
   }


john1990_1

Я бы предположил, что есть более эффективный способ, не так ли?

George Swan

Да


 public static int Play()
        {
            int initialChoice = random.Next(3);//make a choice
            int winningDoor = random.Next(3);//the car is here
            return initialChoice == winningDoor ? 0 : 1;
         }