Интернет-форум

Вернуться   Интернет в Санкт-Петербурге > Разговоры обо всем > Флейм

>> Хостинг - 2 Gb-20 Gb, CPanel, SSH, Web Disk, Softaculous, FTP, MySql, SSL сертификат, BackUP
>> VDS от 200 рублей, активация от 1 до 5 минут, OS: Debian, CentOs, Ubuntu, 10-50 Gb защита от DDoS
>> Конструктор сайтов: 198 шаблонов в 22 категориях! SSL, e-commerce, веб-почта, статистика сайта, 50 мб бесплатно!
Флейм Разговоры обо всем. Счетчик постов отключен.

 
Опции темы
Старый 20.12.2018, 18:29
  #1
Рассказчик

Задача на поиск ошибки в коде C#

Предлагается посмотреть на код вычисления числа pi с наперёд заданной точностью и исправить ошибку. Ошибка состоит в том, что вместо 3.1415... калькулятор вычисляет 3.1417... .
Скрыто содержимое: код

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace PiNumber
{
    using UintInt = Tuple<uint, int>;

    class ArctanSeries
    {
        private ushort[] _memberLast;
        private ushort[] _memberCurrent;
        private ushort[] _totalSum;
        private int _seriesCount;
        private int _multiplier;
        private int _sign;
        private readonly UInt32 _argument1N;

        public int Precision
        {
            get
            {
                return (_totalSum.Length-2)*3;
            }
        }

        public UInt32 Argument1N
        {
            get
            {
                return _argument1N;
            }
        }

        public int SeriesCount
        {
            get
            {
                return _seriesCount;
            }

            set
            {
                _seriesCount = value;
            }
        }

        public uint Multiplier
        {
            get
            {
                return (uint)_multiplier;
            }
        }

        public ArctanSeries(int precision)
        {
            _totalSum = new ushort[precision+2];
        }

        public ArctanSeries(int precision, uint arg1N, int multiplier)
        {
            _argument1N = arg1N;
            _sign = (multiplier < 0) ? -1 : 1;
            _multiplier = multiplier*_sign;
            _memberLast = new ushort[precision+2];
            _memberCurrent = new ushort[precision+2];
            _totalSum = new ushort[precision+2];
            _memberLast[0] = 1;
        }

        public void Clear()
        {
            Array.Clear(_totalSum, 0, _totalSum.Length);
        }

        public ArctanSeries Add(ArctanSeries other)
        {
            return SumMember(other._totalSum, other._sign);
        }

        public void Print(bool sepon, int len = 0)
        {
            int nLen = (0 == len) ?_totalSum.Length:len;
            Console.WriteLine("Series length: {0}", _seriesCount);
            Console.Write("{0},", _totalSum[0]);
            for (int i = 1; i < nLen; i++)
            {
                Console.Write("{0:000}", _totalSum[i]);
                if (sepon && 0 == i % 2)
                    Console.Write(" ");
            }
            Console.Write("   ");
        }

        public int SummMember(int number = 1)
        {
            int count = number;
            while(0 < count--)
            {
                _seriesCount++;
                OneOverN(_argument1N, _memberCurrent);
                _memberCurrent.CopyTo(_memberLast, 0);
                if(0 == _seriesCount%2)
                {
                    continue;
                }

                ushort[] arctanSummMember = new ushort[_memberCurrent.Length];
                OneOverN((uint)_seriesCount, arctanSummMember);
                int iSign = (3 == _seriesCount % 4) ? -1 : 1;
                SumMember(arctanSummMember, iSign*_multiplier);
            }

            return _seriesCount;
        }

        private void OneOverN(uint nN, ushort[] result)
        {
            if (nN > 1)
            {
                int nLen = result.Length - 1;
                uint number = _memberLast[0];
                for (int i = 0; i < nLen; i++)
                {
                    result[i] = (ushort)(number / nN);
                    number = (number % nN) * 1000 + _memberLast[i + 1];
                }
            }
            else
            {
                _memberLast.CopyTo(result, 0);
            }
        }

        private ArctanSeries SumMember(ushort[] member, int multiplier = 1)
        {
            int nLen = _totalSum.Length - 1;
            int nOver = 0;
            int number = 0;

            for (int i = nLen; i >= 0; i--)
            {
                int nDigit = (i < member.Length)? member[i]:0;
                number = (int)_totalSum[i] + multiplier * nDigit + nOver;
                nOver = number / 1000;

                if (number < 0 )
                {
                    number = 1000 + (number % 1000);
                    nOver--;
                }
                else
                {
                    number %= 1000;
                }
                _totalSum[i] = (ushort)number;
            }

            return this;
        }

        public ArctanSeries Multiply(uint multiplier)
        {
            if (multiplier > 1)
            {
                int nLen = _totalSum.Length - 1;
                uint nOver = 0;
                uint number = 0;

                for (int i = nLen; i >= 0; i--)
                {
                    number = _totalSum[i] * multiplier + nOver;
                    _totalSum[i] = (ushort)(number % 1000);
                    nOver = number / 1000;
                }
            }

            return this;
        }
    }

    class PiCalculator
    {
        private ArctanSeries _numberPI;
        private ArctanSeries[] _seriesPI;
        private readonly int _SeriesLength;
        private readonly int _Precision;
        // Euler
        private readonly UintInt[] _seriesPI1 = { new UintInt(2u, 4), new UintInt(3u, 4) };
        // Hermann
        private readonly UintInt[] _seriesPI2 = { new UintInt(2u, 8), new UintInt(7u, -4) };
        // Hutton
        private readonly UintInt[] _seriesPI3 = { new UintInt(3u, 8), new UintInt(7u, 4) };
        // Machin
        private readonly UintInt[] _seriesPI4 = { new UintInt(5u, 16), new UintInt(239u, -4) };
        //  F.C.M. Stormer (1896)
        private readonly UintInt[] _seriesPI5 = { new UintInt(57u, 176), new UintInt(239u, 28),
                                                    new UintInt(682u, -48), new UintInt(12943u, 96) };
        // Kikuo Takano (1982)
        private readonly UintInt[] _seriesPI6 = { new UintInt(49u, 48), new UintInt(57u, 128),
                                                    new UintInt(239u, -20), new UintInt(110443u, 48) };
        // Hwang Chien-Lih (1997)
        private readonly UintInt[] _seriesPI7 = { new UintInt(239u, 732), new UintInt(1023u, 128), new UintInt(5832u, -272),
                                                    new UintInt(110443u, 48), new UintInt(4841182u, -48), new UintInt(6826318u, -400)};
        // Hwang Chien-Lih (2004)
        private readonly UintInt[] _seriesPI8 = { new UintInt(390112u, 145848), new UintInt(485298u, 543632), new UintInt(683982u, 1098036),
                                                    new UintInt(1984933u, -158324), new UintInt(2478328u, 713908), new UintInt(3449051u, -458276),
                                                    new UintInt(18975991u, -586284), new UintInt(22709274u, 247656), new UintInt(24208144u, -276176),
                                                    new UintInt(201229582u, -357724), new UintInt(2189376182u, -175752) };
        private readonly UintInt[] _seriesPI9 = { new UintInt(51387u, 145848), new UintInt(485298u, 106088), new UintInt(683982u, 77100),
                                                    new UintInt(1984933u, -12476), new UintInt(2478328u, -15332), new UintInt(3449051u, -20732),
                                                    new UintInt(18975991u, -148740), new UintInt(22709274u, -44040), new UintInt(24208144u, 15520),
                                                    new UintInt(201229582u, -66028), new UintInt(2189376182u, -29904) };


        static int SeriesLengthFromPrecision(int precision, uint arg1N, uint multiplier)
        {
            int series = 1;
            int step = 100;

            do
            {
                int p = 0;
                series -= step;
                do
                {
                    series += step;
                    int s = series + step;
                    p = (int)Math.Log10(s) + (int)(s * Math.Log10(arg1N)) - (int)Math.Log10(multiplier);
                }
                while (p < precision);
                step /= 10;
            } while (step > 0);

            return ++series;
        }


        public PiCalculator(int precision)
        {
            _Precision = precision;
            int piLength = precision;
            piLength /= 3;
            if (!(0 == precision%3)) piLength++;
            piLength = (piLength < 20)?3*piLength : piLength * 10 / 9;
            UintInt[] seriesPI  = _seriesPI9;
            _seriesPI = new ArctanSeries[seriesPI.Length];
            for(int i = 0; i < seriesPI.Length; i++)
            {
                _seriesPI[i] = new ArctanSeries(piLength, seriesPI[i].Item1, seriesPI[i].Item2);
            }

            _numberPI = new ArctanSeries(piLength);
            uint arg1N = _seriesPI[_seriesPI.Length - 1].Argument1N;
            uint multiplier = _seriesPI[_seriesPI.Length - 1].Multiplier;
            _SeriesLength = SeriesLengthFromPrecision(piLength*3, arg1N, multiplier);

            //Console.WriteLine("Precision pi {0}, series {1}", precision, _SeriesLength);
            Console.WriteLine();
        }

        void Calculate()
        {
            foreach (ArctanSeries series in _seriesPI)
            {
                int nSeries = SeriesLengthFromPrecision(series.Precision, series.Argument1N, series.Multiplier);

                series.SummMember(nSeries - _SeriesLength);
            }

            if (_Precision < 2001)
            {
                for (int i = 0; i < _SeriesLength; i++)
                {
                    _numberPI.Clear();
                    foreach (ArctanSeries series in _seriesPI)
                    {
                        series.SummMember();
                        _numberPI.Add(series);
                    }

                    _numberPI.SeriesCount = i + 1;
                    int CursorTop = Console.CursorTop;
                    _numberPI.Print(false);
                    Console.SetCursorPosition(0, CursorTop);
                }
            }
            else
            {
                foreach (ArctanSeries series in _seriesPI)
                {
                    series.SummMember(_SeriesLength);
                    _numberPI.Add(series);
                }
                _numberPI.SeriesCount = _SeriesLength;
            }
        }

        static void Main(string[] args)
        {
            Console.Write("Enter pi precision: ");
            string strPrecision = Console.ReadLine();
            PiCalculator number = new PiCalculator(int.Parse(strPrecision));
            number.Calculate();
            number.Print();
            Console.ReadLine();
        }

        void Print()
        {
            int piLength = _Precision + 3;
            piLength /= 3;
            if (!(0 == _Precision % 3)) piLength++;

            _numberPI.Print(true, piLength);
        }
    }
}
Viktor на форуме   Ответить с цитированием
Старый 21.12.2018, 00:09
  #2
Долгожитель
 
Аватар для abGluck

Ошибка в OneOverN
uint number переполняется. При замене на ulong вроде считает корректно.

Последний раз редактировалось abGluck; 21.12.2018 в 00:09.. Причина: Добавлено сообщение
abGluck вне форума   Ответить с цитированием
Этот участник поблагодарил abGluck(а) за это Полезное сообщение:
Viktor (21.12.2018)
Старый 22.12.2018, 09:52
  #3
Местный житель

Viktor а что думаете об этой задачке?:
"Не менее интересное событие произошло с Мерилин вос Савант, обладательницей высоченного IQ, с которым ее внесли в Книгу рекордов Гиннеса. Она вела колонку в американском журнале «Parade». Ей присылали вопросы из разных сфер, на которые она давала ответы. Колонка называлась Ask Marilyn.
Ее попросили дать ответ на задачу, основанную на американском шоу «Let's Make a Deal», которую основал и вел Монти Холл. ..."
Задачка здесь:
http://www.yaplakal.com/forum7/topic1885698.html
Алексей Рыбкин вне форума   Ответить с цитированием
Старый 22.12.2018, 18:21
  #4
Рассказчик

Ещё есть код по вычислению числа Эйлера e, оно играет важную роль в теорвере и матстатистике.

Скрыто содержимое: код

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Exp
{
    class ExpCalculator
    {
        private ushort[] _InvNFactorialPrev;
        private ushort[] _InvNFactorial;
        private ushort[] _ENumber;
        private readonly int _SeriesLength;
        private readonly int _Precision;

        public ExpCalculator(int precision)
        {
            _Precision = precision;
            int ELength = precision;
            ELength /=3;
            if (!(0 == precision % 3)) ELength++;
            ELength = (ELength < 9)?2*ELength:ELength * 10 / 9;
            _InvNFactorialPrev = new ushort[ELength+2];
            _InvNFactorial = new ushort[ELength+2];
            _ENumber = new ushort[ELength+2];
            _SeriesLength = SeriesLengthFromPrecision(_Precision + 3);

            //Console.WriteLine("Precision e {0}, series {1}", precision, _SeriesLength);
            Console.WriteLine();
        }

        static int SeriesLengthFromPrecision(int precision)
        {
            int series = 1;
            int step = 100;

            do
            {
                int p = 0;
                series -= step;
                do
                {
                    series += step;
                    int s = series + step;
                    p = (int)(Math.Log10(2 * Math.PI * s) / 2 + s * Math.Log10((double)s / 3));
                }
                while (p < precision);
                step /= 10;
            } while (step > 0);

            return ++series;
        }

        static void Main(string[] args)
        {
            Console.Write("Enter e precision: ");
            string strPrecision = Console.ReadLine();
            ExpCalculator number = new ExpCalculator(int.Parse(strPrecision));
            number.Calculate();
            number.Print();
            Console.ReadLine();
        }

        void Calculate()
        {
            _ENumber[0] = 1;
            _InvNFactorial[0] = 1;

            for (uint n = 1; n <= _SeriesLength; n++)
            {
                int ENumberLen = _ENumber.Length - 1;
                _InvNFactorial.CopyTo(_InvNFactorialPrev, 0);
                uint number = _InvNFactorialPrev[0];
                for(int i = 0; i < ENumberLen; i++)
                {
                    _InvNFactorial[i] = (ushort)(number/n);
                    number = (number%n) * 1000 + _InvNFactorialPrev[i+1];
                }

                number = 0;

                for (int i=ENumberLen; i >= 0; i--)
                {
                    uint OverOne = number/1000;
                    number = (uint)_ENumber[i] + (uint)_InvNFactorial[i] + OverOne;
                    _ENumber[i] = (ushort)(number%1000);
                }

                if (_Precision < 2001)
                {
                    int CursorTop = Console.CursorTop;
                    Console.WriteLine("Series length: {0}", n);
                    EPrint(_ENumber.Length, false);
                    Console.SetCursorPosition(0, CursorTop);
                }
            }
        }

        void Print()
        {
            int piLength = _Precision + 3;
            piLength /= 3;
            if (!(0 == _Precision % 3)) piLength++;
            Console.WriteLine("Series length: {0}", _SeriesLength);
            EPrint(piLength, true);
            Console.WriteLine();
        }

        void EPrint(int Len, bool Sepon)
        {
            int ENumberLen = Len;
            Console.Write("{0},", _ENumber[0]);
            for (int i = 1; i < ENumberLen; i++)
            {
                Console.Write("{0:000}", _ENumber[i]);
                if (Sepon && 0 == i % 2)
                    Console.Write(" ");
            }
            Console.Write("   ");
        }
    }
}


Алексей Рыбкин, да, это чисто студенческая задачка именно по теорверу (не по мат. статистике) и совсем не школьная.
Скрыто содержимое: Решение.

Первым делом выберем вероятностное пространство возможных исходов Ω. Я возьму подмножество пар целых чисел (n,m), где n={-1,0,1}, а m={-1,1}. n — место, где лежит приз, считая от той двери, куда указал игрок, m — дверь, которую открывает ведущий. К исходным трём дверям 1,2,3 добавляем слева и справа ещё три "мнимых" -2,-1,0 и 4,5,6. Игрок выбирает номер из множества {1,2,3}, предположим игрок выбрал дверь #1, элементарное событие выпало (-1,1) (выпало случайно как игральная кость), тогда автомобиль находится за левой дверью от места, куда указал игрок, т.е. это дверь под номером #0, а ведущий открыл правую дверь, т.е. дверь под номером #2. Дверь под номером #0 есть виртуальная копия двери под номером #3, а дверь под номером #4 — копия двери #1, остальные двери {-2,-1,5,6} никак не задействованы. Так вот, первоначальный выбор игроком номера двери из множества {1,2,3} случайным событием не является, а вот место где приз лежит и номер двери, которую ведущий открывает — это случайный элемент ξ=(n,m) из R^2 (можно было бы назвать случайной величиной, если бы был скаляр из R).
Теперь посмотрим на дискретное пространство Ω, оно содержит четыре элементарных исхода. Можно было бы подумать, что их шесть, как декартово произведение {-1,0,1}×{-1,1}, но очевидно там нет исходов вида (-1,-1) и (1,1), их нет или иначе можно сказать, что они имеют нулевую вероятность. Мы хотим вычислить вероятности элементарных исходов, также очевидно, что P(A)=p(0,-1)+p(0,1)=1/3 и P(B)=p(-1,1)+p(1,-1)=2/3. P(A) — вероятность, что игрок своим выбором угадал за какой дверью находится автомобиль, P(B) — вероятность противоположенного события, что неугадал, она равна 1−P(A)=1−1/3=2/3. Соответственно событие A состоит из {(0,-1), (0,1)}, событие B состоит из {(-1,1), (1,-1)}, мы знаем их вероятности, но не знаем вероятности элементарных событий. Обозначим вероятность p(0,-1) неизвестной переменной a и p(-1,1)=b, тогда
p(0,1)=a
p(0,-1)=1/3−a
p(-1,1)=b
p(1,-1)=2/3-b
Получается, что функция распределения случайного элемента на Ω может быть достаточно произвольной, с одной степенью свободы, задаваемой параметром a, где a∈[0,1/3], b=1/3.
Мы будем решать задачу, точно не зная какое принимает значение параметр a. Этот параметр не задан, поэтому если задача корректная, то ответ не будет зависеть от этой неизвестной.
Нам надо посчитать вероятности событий P(не менял выбор и выиграл автомобиль)=P(A)=1/3, а также посчитать P(менял выбор и выиграл автомобиль)=P(B)=2/3.
Как уже говорилось наш случайный элемент (ξ1, ξ2) есть на самом деле пара случайных величин ξ1 и ξ2. ξ1 принимает значения {-1,0,1}, а ξ2 — значения {-1,1}. Введём новую случайную величину η1: (ξ1, ξ2) → R, заданную функцией f1(x ,y)= 1+x∙y. Событие A, состоящее в том, что игрок угадал приз не меняя выбор есть не что иное как событие {(w1,w2) : η1(w1,w2)=1}=A принять новой случайной величине η1 значение 1, поэтому P(A)=P(η1=1)=1/3. Можно ещё так сказать, обозначим A' — событие, что игрок не менял выбор, это есть всё Ω, потому что менять или не менять выбор игроку не является случайностью, поэтому P(A')=1. Выиграть игроку при условии A', P(A|A')=P(η1=1|A')=(η1=1|Ω)=1/3.
Событие B, оно на самом деле влечёт событие B'=Ω, что игрок меняет свой первоначальный выбор, именно детерминированно меняет, не случайно. Что значит меняет выбор? Это значит мы вводим новую случайную величину η2 : (ξ1, ξ2) → R, заданную функцией f2(x ,y)= (-1)∙x∙y. Выиграть игроку при условии B', P(B|B')=P(η2=1|B')=(η2=1|Ω)=2/3.

Что мы видим, стратегия "не менять" или "менять" выбор не является случайностью, никак не присутствует в пространстве элементарных событий Ω, а на самом деле определяет две разные случайные величины η1 и η2, принимающие два значения {0,1}, где A={η1=1} и B={η2=1} есть события выиграть автомобиль, ответ не зависит от того, чему равен параметр a.

Итого стратегии "не менять выбор" и "менять выбор" — это просто две разных случайных величины η1 и η2 на одном и том же вероятностном пространстве Ω. Поэтому вероятности P(η1=1) и P(η2=1) отличаются в два раза.
Раз у нас есть пара случайных величин ξ1, ξ2, то сразу напрашиваются естественные вопросы, эти величины зависимы/независимы, коррелированы/некоррелированны?

В викиучебнике до сих пор лежит мой код на c++, который эмулирует этот парадокс.
Стратегия "Anchorman randomly opens an empty door, 50% : 50%" на самом деле означает, что выбрано a=1/6, b=2/6 у свободных параметров.
"Anchorman strategy: Anchorman tries to open only the next empty door" — выбрано a=1/3, b=1/3.
"Anchorman strategy: Anchorman tries to open only the previous empty door" — выбрано a=0, b=1/3.

Цитата:
Все они доказывали ей, что она сеет невежество, ведь вероятность выиграть машину после открытия одной из трёх дверей ведущим будет 50 на 50.
Вполне возможно, что спора никакого не было, потому что разговор о разных вероятностях. Профессора говорили про условную вероятность, возможно условная и будет 1/2, а Мэрилин говорила просто про P(A) и P(B), условные вероятности имеют обозначения P(игрок выиграл автомобиль при условии, что ведущий открыл дверь x)=P(C|ξ2=x).
Посчитайте например P(η1=1|ξ2=1) и P(η2=1|ξ2=1), равно ли это 1/2?

Цитата:
Популярной эту задачу также сделал эпизод из фильма «21» с опальным Кевином Спейси в главной роли.
"... Мой ответ основан на статистике, на замене переменной."
Эти слова уже художественный вымысел, тут нет никакой статистики и я не слышал про метод "замены переменной". Выбор действительно выгодно менять, так как соответствующая случайная величина η2 принимает значение 1 с большей вероятностью, чем случайная величина η1.

Последний раз редактировалось Viktor; 23.12.2018 в 18:46..
Viktor на форуме   Ответить с цитированием
Старый 23.12.2018, 00:38
  #5
Местный житель

Viktor а по моему здесь всё просто. Ибо имеем дело с двумя разными задачами.
То есть задача 1-выбор из трёх дверей-вероятность что за конкретной дверью-1/3, задача 2-выбор из 2 дверей ,нахождения за конкретной вероятность 1/2.
Поэтому смена двери не делает вероятность обнаружения именно за ней больше.
Ведь если б был первоначально предложен выбор из двух дверей-никто бы не сомневался в ответе 1/2-не так ли?
А третья дверь хорошо затуманила мозги.

Последний раз редактировалось Алексей Рыбкин; 23.12.2018 в 00:49..
Алексей Рыбкин вне форума   Ответить с цитированием
Старый 23.12.2018, 02:52
  #6
Рассказчик

Алексей Рыбкин, всё просто в смысле не нужны условные вероятности? Модель можно упростить ещё сильнее, убрав от туда вторую координату, номера открываемые ведущим дверей. А также можно усложнить, когда игрок иногда меняет свой выбор, а иногда нет по некоторому алгоритму или случайно. Можно поставить такой вопрос, возможно ли игроку придумать такую стратегию, кроме известной "не менять свой выбор", чтобы вероятность выигрыша оказалась больше 2/3? При этом разрешается как-нибудь подправить стратегию ведущему, кроме откровенных подсказок, например как-то задать параметры a и b для выбора пустых дверей.

Посчитайте вероятности P(η1=1|ξ2=1) и P(η2=1|ξ2=1), на самом деле они не всегда 1/2.

В программной симуляции можно увидеть, что не всегда вероятность 1/2.
Цитата:
Anchorman strategy: Anchorman tries to open only the next empty door.

User strategy: Keep the choose
0) next door was opened (66%) - Wins: 500077 (50%); Loose: 499641 (49%)
1) previous door was opened (33%) - Wins: 0 (0%); Loose: 500282 (100%)

User strategy: Change the choose
0) next door was opened (66%) - Wins: 500856 (50%); Loose: 500137 (49%)
1) previous door was opened (33%) - Wins: 499007 (100%); Loose: 0 (0%)
Здесь мы видим, что если ведущий открыл "next door", за выбранной дверью в 500077 случаев оказался приз, за другой в 499641 случаев, это как раз 50% на 50%.
А вот если была открыта "previous door", за выбранной вообще 0 случаев, а за другой 500282, тут как раз нарушается вероятность 1/2.

Поэтому ничего упростить не получится, надо вводить понятие условных вероятностей. Считать P(η1=1|ξ2=1) и P(η2=1|ξ2=1), а также P(η1=1|ξ2=-1) и P(η2=1|ξ2=-1) и искать при каких a, b можно получить 1/2. Т.е. при каком именно поведении ведущего это достигается?

Последний раз редактировалось Viktor; 23.12.2018 в 02:55..
Viktor на форуме   Ответить с цитированием
Старый 23.12.2018, 11:28
  #7
Местный житель

Я в теории вероятностей не силён-конечно проходил когда учился но давно-но что то это сильно противоречит здравому смыслу.
Получается что вероятность в этой задаче не объективная величина а вещь зависящая от человеческого выбора.
И-мне вот любопытно-если продолжить-то есть после того как дверь поменяли и в связи с этим вероятность выросла-снова её поменять-то есть допустим первоначально выбрали дверь 1, открыли дверь 3, после этого поменяли свой выбор на дверь 2 ,увеличив шансы -на вопрос точно дверь 2? снова поменять выбор и вернуться к двери 1-вероятность снова возрастёт -относительно выбора двери 2?
То есть получится что выбор двери 2 увеличил шансы по сравнению с выбором двери 1 а потом возврат к двери 1 в свою очередь увеличил шансы.
К сожалению моё невежество в математическом аппарате теории вероятностей не позволяет это просчитать однако чую что здесь что то не так.
Может нет тут условных вероятностей- ведь насколько помню это вероятность некого события если наступит какое то другое событие. Но если между событиями нет никакой связи то по моему понятие условной вероятности становится бессмысленным.
Ну например можно посчитать какова вероятность того что человек сломает ногу если споткнётся но какова вероятность такого же события-сломал ногу-если на третьем этаже в доме номер таком то кто то открыл форточку?
Что же касается моделирования на машинах то какую то теорему то же моделировали и выяснили что она верна до каких то гигантских значений путём простого перебора на компах- но никто при этом не объявил на этом основании её доказанной.

Последний раз редактировалось Алексей Рыбкин; 23.12.2018 в 11:36..
Алексей Рыбкин вне форума   Ответить с цитированием
Старый 23.12.2018, 17:48
  #8
Рассказчик

Цитата:
Сообщение от Алексей Рыбкин Посмотреть сообщение
Может нет тут условных вероятностей- ведь насколько помню это вероятность некого события если наступит какое то другое событие. Но если между событиями нет никакой связи то по моему понятие условной вероятности становится бессмысленным.
Приходится вводить условные вероятности, после того как появляются вопросы типа "А с какой вероятностью будет находится приз за указанной игроком дверью или за другой, если ведущий откроет пустую дверь такую-то?". И конечно события "приз находится за такой-то дверью" и "ведущий открыл такую-то" зависимые, хотя бы потому, что ведущий не может открыть дверь с автомобилем, он знает за какой дверью приз и не открывает её. Математики не пользуются терминологией "между событиями нет связи", в этом случае говорят, что события независимы или случайные величины независимы.
Цитата:
Раз у нас есть пара случайных величин ξ1, ξ2, то сразу напрашиваются естественные вопросы, эти величины зависимы/независимы, коррелированы/некоррелированны?
Кроме зависимы/независимы может исследоваться факт коррелированы/некоррелированны.

Цитата:
Сообщение от Алексей Рыбкин Посмотреть сообщение
Что же касается моделирования на машинах то какую то теорему то же моделировали и выяснили что она верна до каких то гигантских значений путём простого перебора на компах- но никто при этом не объявил на этом основании её доказанной.
Ну тут не теорема и не доказательство, тут скорее всего некий опыт, который подтверждает уже аналитически/теоретически полученный результат. Это похоже на физический опыт "Доски Гальтона", который подтверждает уже доказанную теорему ЦПТ (центральную предельную теорему). И кстати есть примеры, когда моделирование помогает что-то доказать, например в теории чисел часто нечто доказывается для всех натуральных чисел больших там некой границы M, а для чисел от 1 до M проверку проводят при помощи программы.

Цитата:
Поэтому ничего упростить не получится, надо вводить понятие условных вероятностей. Считать P(η1=1|ξ2=1) и P(η2=1|ξ2=1), а также P(η1=1|ξ2=-1) и P(η2=1|ξ2=-1) и искать при каких a, b можно получить 1/2. Т.е. при каком именно поведении ведущего это достигается?
Забыл добавить ещё одно условие, что b=1/3 всегда?
P(η1=1|ξ2=-1)=(1/3−a)/(1-a-b) и P(η2=1|ξ2=-1)=(2/3-b)/(1-a-b),
P(η1=1|ξ2=-1)=P(η2=1|ξ2=-1)=1/2 выполняется при 1/3=b-a.
Под это условие подходит стратегия "Anchorman strategy: Anchorman tries to open only the previous empty door".

P(η1=1|ξ2=1)=a/(a+b) и P(η2=1|ξ2=1)=b/(a+b),
P(η1=1|ξ2=1)=P(η2=1|ξ2=1)=1/2 выполняется при a=b.
Подходит стратегия "Anchorman strategy: Anchorman tries to open only the next empty door". У других стратегий a≠b. Посчитаем для этой стратегии P(η1=1|ξ2=-1) и P(η2=1|ξ2=-1). P(η1=1|ξ2=-1)=0 и P(η2=1|ξ2=-1)=1. Видим 1/2 не получается, потому что 1/3≠b-a.

А стратегия ведущего "Anchorman randomly opens an empty door, 50% : 50%" не подходит ни под первый, ни под второй вариант, в любом случае 1/2 не получается.

Последний раз редактировалось Viktor; 23.12.2018 в 18:59..
Viktor на форуме   Ответить с цитированием
Старый 23.12.2018, 19:02
  #9
Местный житель

А давайте без формул -по простому.
Вот выбрали дверь 1, открыли дверь 3-если теперь поменять выбор с двери 1 на дверь 2 то увеличим шансы-пусть так.
То есть вероятность нахождения за дверью 2 выше.
А если б первоначально выбрали дверь 2? то по таким же соображениям вероятность нахождения за дверью 1 будет выше.
То есть вероятность зависит от нашего первоначального выбора так что ли?
Вероятность выпадения решки или орла зависит от того какой стороной держать кверху?
Я не силён в математическом аппарате но где то явно ошибка и ошибка судя по всему в самых основах.
Алексей Рыбкин вне форума   Ответить с цитированием
Старый 23.12.2018, 19:37
  #10
Рассказчик

Цитата:
Сообщение от Алексей Рыбкин Посмотреть сообщение
То есть вероятность зависит от нашего первоначального выбора так что ли?
Первый шаг в понимании решения этой задачи состоит в том, что не важно выбирает игрок всегда среднюю дверь или какую-то определённую по некоторому алгоритму или случайно. Случайностью является дельта, некоторое смещение на котором находится приз от той двери, которую выбрал игрок.
Пусть двери имеют номера 1,2,3, игрок их выбирает с вероятностями там p1=p(j=1),p2=p(j=2),p3=p(j=3), машину за дверями прячут с вероятностью 1/3=p(i=1)=p(i=2)=p(i=3). Δ=i-j={-2,-1,0,1,2}
p(Δ=-2)=1/3 p3
p(Δ=-1)=1/3 p2+1/3 p3=1/3 (1-p1)
p(Δ=0)=1/3 (p1+p2+p2)=1/3
p(Δ=1)=1/3 p1+1/3 p2=1/3 (1-p3)
p(Δ=2)=1/3 p1
Что мы видим, если учесть, что смещения -2 и 1 указывают на одну и ту же дверь, как и смещения 2 и -1. Пусть Δ'=1={Δ:-2,1}, Δ'=-1={Δ:2,-1} и Δ'=Δ=0. Ввожу новое смещение Δ' или по научному новую случайную величину.
p(Δ'=1)=p(Δ=-2)+p(Δ=1)=1/3 p3 + 1/3 (1-p3)=1/3
p(Δ'=0)=p(Δ=0)=1/3
p(Δ'=-1)=p(Δ=2)+p(Δ=-1)=1/3 p1 + 1/3 (1-p1)=1/3

То есть, какой бы хитрый алгоритм выбора дверей не задумал игрок, что вылилось бы в определённый набор вероятностей p1,p2,p3, мы можем модель при помощи случайной величины Δ' свести к набору значений {-1,0,1} с вероятностями 1/3. Можно догадаться, что Δ' это и есть случайная величина ξ1.

Поэтому дальше можно считать, что игрок выбирает всегда среднюю дверь, что означает p1=0,p2=1,p3=0, а распределение случайной величины Δ'(ξ1) остаётся такой как и было. Как говорят математики, от этого допущения общность не меняется (не умаляя общности можно считать, что p1=0,p2=1,p3=0).
А раз так, то ведущий всегда открывает либо левую, либо правую. В случае решения игрока менять свой первоначальный выбор, он второй попыткой открывает либо левую, либо правую дверь.
ξ1=-1 — приз оказался за левой дверью, игрок всегда указывает пальцем на среднюю
ξ1=0 — приз оказался за средней дверью, игрок угадал где находится автомобиль
ξ1=1 — приз оказался за правой дверью, игрок всегда указывает пальцем на среднюю

Последний раз редактировалось Viktor; 23.12.2018 в 19:50..
Viktor на форуме   Ответить с цитированием
Ответ

Метки
code, problem, programming

Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Посоветовать и Подсчитать - задача не простая ;) cheek Hardware 29 06.05.2010 17:00
Задача, думаю... Hero Флейм 10 10.09.2008 17:50
Ошибки, проблемы соединения Raproid "Ростелеком-Северо-Запад" 9 05.01.2008 17:09
умоляю о помощи. Задача "Золотая гора" ("Треугольник") на C FK2703 Флейм 7 16.12.2007 17:58
ошибки пласа realmen Флейм 4 12.12.2005 10:48


Часовой пояс GMT +3, время: 18:03.


DSLnet.ru © 2004-2012. Все права защищены.
vBulletin® Version 3.8.2 Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Rambler's Top100 Рейтинг@Mail.ru