2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки


Правила форума


Посмотреть правила форума



Начать новую тему Ответить на тему
 
 Парадокс Монти Холла
Сообщение21.06.2024, 12:47 


03/06/24
17
Попробовал реализовать.
Код:
CLEAR ALL
LOCAL lni, lnj, lnw, lnv, lnTrue, llDone, lnTryings
*lni, lnj - переменные цикла
*lnw - номер коробки, в которой 1
*lnv - мой выбор
*lnTrue - количество угадываний
*lnTryings - количество попыток

LOCAL ARRAY arr1(3)
lnTrue = 0
lnTryings = 1000000
FOR lni = 1 TO lnTryings
    arr1=0
    lnw = 0
    llDone = .F.
    DO WHILE lnw = 0
        lnw = ROUND(RAND()*3,0)
    ENDDO
    arr1[lnw] = 1
    lnv = 0
    DO WHILE lnv = 0
        lnv = ROUND(RAND()*3,0)
    ENDDO
    FOR lnj = 1 TO 3
        IF lnj = lnv
            LOOP
        ENDIF
        IF arr1[lnj] = 0
            DO CASE
            CASE lnj = 1
                IF lnv = 2
                    lnv = 3
                ELSE
                    lnv = 2
                ENDIF
            CASE lnj = 2
                IF lnv = 1
                    lnv = 3
                ELSE
                    lnv = 1
                ENDIF
            OTHERWISE
                IF lnv = 2
                    lnv = 1
                ELSE
                    lnv = 2
                ENDIF
            ENDCASE
            IF arr1[lnv] = 1
                lnTrue = lnTrue + 1
            ENDIF
            EXIT
        ENDIF
    ENDFOR
ENDFOR
?100*lnTrue/lnTryings

Процент выигрыша равен 64.
Почему не 67?

-- 21.06.2024, 12:57 --

Ответ ИИ
Парадокс Монти Холла заключается в том, что вероятность выигрыша увеличивается, если после выбора участником одной из трёх дверей ведущий шоу открывает одну из оставшихся дву дверей, за которой находится коза. Это происходит потому, что вероятность попасть в дверь с призом при изменении выбора увеличивается с 1/3 до 2/3.

В представленном коде вероятность выигрыша определена как 64%, так как процесс выбора дверей с помощью случайных чисел моделируется многократно, и вероятность угадывания вычисляется как отношение количества успешных попыток к общему числу попыток.

Если поменять секцию кода, определяющую новый выбор участника после открытия одной из дверей ведущим шоу, на следующую:
Код:
            DO CASE
            CASE lnj = 1
                IF lnv = 2
                    lnv = 1
                ELSE
                    lnv = 2
                ENDIF
            CASE lnj = 2
                IF lnv = 1
                    lnv = 2
                ELSE
                    lnv = 1
                ENDIF
            OTHERWISE
                IF lnv = 2
                    lnv = 1
                ELSE
                    lnv = 2
                ENDIF
            ENDCASE

то вероятность выигрыша будет подсчитываться как 67%, что ближе к истинной вероятности из-за изменения выбора после открытия двери ведущим.

-- 21.06.2024, 13:01 --

Получилось 47
:)

-- 21.06.2024, 13:15 --

Второй ответ ИИ кажется ближе
Цитата:
В данном коде имитируется ситуация, когда участник всегда меняет свой выбор после открытия одной из невыигрышных дверей. Из-за этого вероятность выигрыша повышается до 64%, а не до 67%.


Третий ответ ИИ
Цитата:
Парадокс Монти Холла заключается в том, что вероятность выигрыша увеличивается, если после вашего первоначального выбора вам дается возможность изменить свой выбор. В данном коде симулируется ситуация игры со сменой выбора, и вероятность выигрыша действительно приближается к 2/3 (67%), а не 64%. Возможно, в коде есть ошибка или неточность, из-за которой результат отличается от ожидаемого. Необходимо провести дополнительный анализ кода для выявления причины этого расхождения.

:-D

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 13:16 
Заслуженный участник


07/08/23
1097
alex; в сообщении #1643454 писал(а):
Почему не 67?

Потому что это всего лишь 1000000 экспериментов вместо бесконечности, наверное. Попробуйте сделать миллиард итераций. В таких случаях ещё можно прикинуть среднеквадратичное отклонение для выборочного ожидания.

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 13:29 
Заслуженный участник
Аватара пользователя


11/03/08
9904
Москва
Здесь ошибка.
Код:
   DO WHILE lnw = 0
        lnw = ROUND(RAND()*3,0)
    ENDDO

Вероятности получаются не равны, для третьей двери меньше.
Чисто вероятностно такое отклонение не объяснить, $\sigma=\sqrt{p(1-p)n}\approx 471.4$
А изменение от 66.6667% до 64% это 26666.7 испытаний.

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 13:38 
Заслуженный участник
Аватара пользователя


16/07/14
9151
Цюрих
(если успеете - замените в сообщении блоки [code] на [syntax lang="FreeBasic"], если это правда Basic, ну или на соответственно другой язык)
Вас интересует парадокс Монти-Холла, проблема генерации случайных чисел Вашим генератором, или почему чатботы несут бред? Это три разных вопроса.
dgwuqtj в сообщении #1643458 писал(а):
Потому что это всего лишь 1000000 экспериментов вместо бесконечности, наверное
Ну всё же среднеквадратичное отклонение (в долях) $\sqrt\frac{p(1-p)}{n} \approx \frac{1}{5000}$, так что стоит ждать отличия в третьем знаке, но не во втором.

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 13:40 


10/03/16
4444
Aeroport
alex; в сообщении #1643454 писал(а):
Возможно, в коде есть ошибка или неточность, из-за которой результат отличается от ожидаемого. Необходимо провести дополнительный анализ кода для выявления причины этого расхождения.


Скоро программизды не понадобятся, говорили они. Любая домохозяйка сможет писать код на естественном языке, говорили они...

-- 21.06.2024, 13:41 --

mihaild в сообщении #1643462 писал(а):
чатботы несут бред


А я б вот не сказал, что совсем уж бред. Вполне себе уровень среднестатичтического студента Бауманки

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 13:55 


03/06/24
17
Не успел блок code заменить.
Реализовал на C#
Результат тот же 64.
Видимо ошибка в алгоритме.
код: [ скачать ] [ спрятать ]
Используется синтаксис C#
using System;

public class Program
{
    public static void Main()
    {
        int lni, lnj, lnw, lnv, lnTrue, lnTryings;
        int[] arr1 = new int[3];
        lnTrue = 0;
        lnTryings = 1000000;

        Random rand = new Random();

        for (lni = 0; lni < lnTryings; lni++)
        {
            Array.Clear(arr1, 0, arr1.Length);
            lnw = -1;

            while (lnw == -1)
            {
                lnw = (int)Math.Round(rand.NextDouble() * 3) - 1;
            }

            arr1[lnw] = 1;
            lnv = -1;

            while (lnv == -1)
            {
                lnv = (int)Math.Round(rand.NextDouble() * 3 - 1);
            }

            for (lnj = 0; lnj < 3; lnj++)
            {
                if (lnj == lnv)
                {
                    continue;
                }
                if (arr1[lnj] == 0)
                {
                    switch (lnj)
                    {
                        case 0:
                            lnv = (lnv == 1) ? 2 : 1;
                            break;
                        case 1:
                            lnv = (lnv == 0) ? 2 : 0;
                            break;
                        default:
                            lnv = (lnv == 0) ? 1 : 0;
                            break;
                    }
                    if (arr1[lnv] == 1)
                    {
                        lnTrue++;
                    }
                    break;
                }
            }
        }
        Console.WriteLine(100 * (double)lnTrue / (double)lnTryings);
    }
}
 

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 14:08 
Заслуженный участник
Аватара пользователя


16/07/14
9151
Цюрих
alex;, попробуйте для начала более простой эксперимент: без всяких Монти-Холлов, сгенерировать Вашим методом равномерное распределение на $\{0, 1, 2\}$. И посмотрите, что получится.

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 14:16 
Аватара пользователя


11/12/16
13851
уездный город Н
Вот тут
Код:
            while (lnw == -1)
            {
                lnw = (int)Math.Round(rand.NextDouble() * 3) - 1;
            }


ерунда написана. Нельзя при программировании употреблять траву и прочие стимуляторы.

Выражение внутри цикла выдает четыре значения:
$-1$ с вероятностю $1/6$
$0$ с вереятностью $1/3$
$1$ с вероятностю $1/3$
$2$ с вереятностью $1/6$

Потом циклом обрезается "плохая" минус единица.
:mrgreen:

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 14:43 


03/06/24
17
Да, заменил случайное распределение. Получилось 67.
Используется синтаксис C#
            while (lnw == -1)
            {
                lnw = (int)Math.Floor(rand.NextDouble() * 3);
            }
 

Полный код.
код: [ скачать ] [ спрятать ]
Используется синтаксис C#
using System;

public class Program
{
    public static void Main()
    {
        int lni, lnj, lnw, lnv, lnTrue, lnTryings;
        int[] arr1 = new int[3];
        lnTrue = 0;
        lnTryings = 1000000;

        Random rand = new Random();

        for (lni = 0; lni < lnTryings; lni++)
        {
            Array.Clear(arr1, 0, arr1.Length);
            lnw = -1;

            while (lnw == -1)
            {
                lnw = (int)Math.Floor(rand.NextDouble() * 3);
            }

            arr1[lnw] = 1;
            lnv = -1;

            while (lnv == -1)
            {
                lnv = (int)Math.Floor(rand.NextDouble() * 3);
            }

            for (lnj = 0; lnj < 3; lnj++)
            {
                if (lnj == lnv)
                {
                    continue;
                }
                if (arr1[lnj] == 0)
                {
                    switch (lnj)
                    {
                        case 0:
                            lnv = (lnv == 1) ? 2 : 1;
                            break;
                        case 1:
                            lnv = (lnv == 0) ? 2 : 0;
                            break;
                        default:
                            lnv = (lnv == 0) ? 1 : 0;
                            break;
                    }
                    if (arr1[lnv] == 1)
                    {
                        lnTrue++;
                    }
                    break;
                }
            }
        }
        Console.WriteLine(100 * (double)lnTrue / (double)lnTryings);
    }
}
 

Спасибо.

-- 21.06.2024, 15:05 --

Изначальный код на Foxpro должен выглядеть так
Код:
CLEAR ALL
LOCAL lni, lnj, lnw, lnv, lnTrue, lnTryings, lnQty
*lni, lnj - переменные цикла
*lnw - номер коробки, в которой 1
*lnv - мой выбор
*lnTrue - количество угадываний
*lnTryings - количество попыток

lnQty = 3
LOCAL ARRAY arr1(lnQty)
lnTrue = 0
lnTryings = 1000000
FOR lni = 1 TO lnTryings
    arr1=0
    lnw = 0
    llDone = .F.
    DO WHILE lnw = 0
        lnw = FLOOR(RAND()*3)+1
    ENDDO
    arr1[lnw] = 1
    lnv = 0
    DO WHILE lnv = 0
        lnv = FLOOR(RAND()*3)+1
    ENDDO
    FOR lnj = 1 TO 3
        IF lnj = lnv
            LOOP
        ENDIF
        IF arr1[lnj] = 0
            DO CASE
            CASE lnj = 1
                IF lnv = 2
                    lnv = 3
                ELSE
                    lnv = 2
                ENDIF
            CASE lnj = 2
                IF lnv = 1
                    lnv = 3
                ELSE
                    lnv = 1
                ENDIF
            OTHERWISE
                IF lnv = 2
                    lnv = 1
                ELSE
                    lnv = 2
                ENDIF
            ENDCASE
            IF arr1[lnv] = 1
                lnTrue = lnTrue + 1
            ENDIF
            EXIT
        ENDIF
    ENDFOR
ENDFOR
?100*lnTrue/lnTryings

Нормальное распределение
Код:
Math.floor(Math.random() * (max - min + 1)) + min

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 15:12 
Аватара пользователя


11/12/16
13851
уездный город Н
alex; в сообщении #1643480 писал(а):
Нормальное распределение


Это не нормальное распределение, а дискретное равномерное распределение.

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 15:29 
Заслуженный участник
Аватара пользователя


16/07/14
9151
Цюрих
Если длина диапазона не является степенью двойки, то это тоже не совсем равномерное, но отклонение будет только в довольно далеких знаках.
(известная задачка - как, имея монетку, сделать равномерное распределение на $n$ вариантах)

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 15:33 
Заслуженный участник
Аватара пользователя


11/03/08
9904
Москва
Функция Round округляет к ближайшему целому. То есть при генерации равномерно распределённого от 0 до 3 в 1/6 случаев будет от 0 до 0.5, округление до нуля, выдаётся 0 и повторяется генерация, в 1/3 будет от 0.5 до 1.5, округляется до единицы, в 1/3 от 1.5 до 2.5, округляется до 2, в 1/6 от 2.5 до 3. С учётом отбрасываний в 40% случаев будет 1, в 40% 2 и в 20% 0. Вот и неравномерность.
Либо заменить Round на Floor или Trunc (поскольку положительные - разницы нет), или, если очень хочется Round, генерировать от 0.5 до 3.5 (собственно, достаточно прибавить 0.5, кстати, и нули отбрасывать не придётся, за неимением оных).

(Оффтоп)

Но FOXPRO в качестве языка моделирования...
"В гамаке, но только стоя!"

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 16:56 


03/06/24
17
EUgeneUS в сообщении #1643484 писал(а):
alex; в сообщении #1643480 писал(а):
Нормальное распределение


Это не нормальное распределение, а дискретное равномерное распределение.


По мне так, вполне, себе нормальное.
:D

Еще раз, всем спасибо.

P.S.
Бедный ИИ.
Сколько дураков ему морочат голову.

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 19:09 
Аватара пользователя


11/12/16
13851
уездный город Н
alex; в сообщении #1643498 писал(а):
По мне так, вполне, себе нормальное.

:facepalm: :mrgreen:

Вот нормальное распределение:
$f(x)= \frac{1}{\sigma \sqrt{2 \pi}} e^{- (\frac{ x - \mu}{2 \sigma})^2}$

А у Вас - дискретное равномерное.

 Профиль  
                  
 
 Re: Парадокс Монти Холла
Сообщение21.06.2024, 22:52 


03/06/24
17
Как реализовать алгоритм для 1000 коробок(дверей)?
Для оптимизации надо исходить из первоначального выбора.
Если первый выбор правильный, то проигрыш.
Если нет, то выигрыш.
Реализация для любого количества дверей.
Код:
CLEAR ALL
LOCAL lni, lnj, lnw, lnv, lnTrue, lnTryings, lnQty
*lni, lnj - переменные цикла
*lnw - номер коробки, в которой 1
*lnv - мой выбор
*lnTrue - количество угадываний
*lnTryings - количество попыток
*lnQty - количество дверей

lnQty = 3
LOCAL ARRAY arr1(lnQty)
lnTrue = 0
lnTryings = 1000000
FOR lni = 1 TO lnTryings
    arr1=0
    lnw = FLOOR(RAND()*lnQty)+1
    arr1[lnw] = 1
    lnv = FLOOR(RAND()*lnQty)+1
    IF arr1[lnv] = 0
        lnTrue = lnTrue + 1
    ENDIF
ENDFOR
?100*lnTrue/lnTryings

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Модераторы: Модераторы Математики, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: VanD


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group