Форум умных людей

Задачи и головоломки => Для программистов => Тема начата: Sirion от Июль 23, 2012, 10:50:40



Название: Два бога и монетка (программирование)
Отправлено: Sirion от Июль 23, 2012, 10:50:40
даёшь новый раздел!

Два бессмертных бога играют в следующую азартную игру: они кидают симметричную монетку и записывают результаты бросков. Если в некоторый момент полученная запись окажется симметричной и будет иметь чётную длину (например, "орёл-решка-решка-орёл"), выигрывает первый бог. В противном случае, если после бесконечного количества бросков первый бог так и не победит, выигрыш достаётся второму богу.

Задача: рассчитать вероятность победы первого бога с точностью до... скажем, ста знаков после запятой =)

Альтернативно, вы можете попытаться решить задачу на уровне чистой математики и дать этой вероятности аналитическое представление. Удачи. Мне не удалось.


Название: Re: Два бога и монетка (программирование)
Отправлено: Funeralla от Июль 23, 2012, 17:22:43
что-то мне кажется вероятность равна 0.25...
доказать (ну или опровергнуть) ещё предстоит..


Название: Re: Два бога и монетка (программирование)
Отправлено: Sirion от Июль 24, 2012, 12:11:36
ну, попробуйте)


Название: Re: Два бога и монетка (программирование)
Отправлено: ☭-Изделие 20Д от Июль 24, 2012, 19:47:42
Вот Вам монетка
кидайте :bravo:
(http://altfast.ru/uploads/posts/2010-09/1285348255_berloga.net_516609544.jpg)


Название: Re: Два бога и монетка (программирование)
Отправлено: Вилли ☂ от Июль 24, 2012, 21:14:03
а не так?  :tomato:

P(n) = 0 + 1/2 + 0 + 1/8 + 0 + ... (1/2)^n,    n = 2k-1

P(1) = 0
P(2) = 50%
P(4) = 62,5%
...
P = 2/3

(http://latex.codecogs.com/gif.latex?\sum_{n=1}^{\infty } \frac{1}{2^{2n-1}})



Название: Re: Два бога и монетка (программирование)
Отправлено: Michael от Июль 25, 2012, 04:48:17
а не так?  :tomato:

P(n) = 0 + 1/2 + 0 + 1/8 + 0 + ... (1/2)^n,    n = 2k-1

P(1) = 0
P(2) = 50%
P(4) = 62,5%
...
P = 2/3

(http://latex.codecogs.com/gif.latex?\sum_{n=1}^{\infty } \frac{1}{2^{2n-1}})


Нет, неправильно.
В P(4) встречаются случаи из P(2), значит ты их посчитал 2 раза, надо 1 раз их вычесть.
Если P(2,4) - вероятность того что последовательность попала под случай 2 и случай 4, то
P(2) + P(4) - P(2,4)
И т.д. Например
P(2) + P(4) + P(6) -
- P(2,4) - P(2,6) - P(4,6) +
+ P(2,4,6)
Не уверен что это решается.


Название: Re: Два бога и монетка (программирование)
Отправлено: Вилли ☂ от Июль 25, 2012, 09:15:37
P(n) - вероятность выиграть за n ходов.  :whiteflag:

P(1) = 0                         // один раз бросили, нечетное, никакой симетрии
P(2) = 1/2                      // два раза бросали (ОО, РР, РО, ОР). вероятность выиграть 2 из 4-х = 50%
далее может вероятность только расти ("вероятность выиграть за n ходов")

P(3) = 1/2                      // три раза бросали. Нечётное-> на этом ходе не выиграем.
                                      // Вероятность не выросла.
                                      // П.С. тут важно, что выпало, но это посчитаем на след ходе  :-[

P(4) = 1/2 + 1/8            //  РООО,РООР (при Р=1/8),  РОРО,РОРР (при Р=1/8)
                                     //  или ОРОО,ОРОР (при Р=1/8) ,ОРРО,ОРРР (при Р=1/8)
                                     //  т.е.       P(4) = P(3) + (1/2) * (1/8) + (0) * (1/8)
                                     //               + (0) * (1/8) + (1/2) * (1/8) = 1/2 + 1/8 = 0,625 (62,5%)

Показать скрытый текст

и т.д.

Р = 2/3  (~66,67%)


Название: Re: Два бога и монетка (программирование)
Отправлено: Sirion от Июль 25, 2012, 11:34:22
Таки нет. Вероятность, которую я вычислил, не выражается ни рациональным числом, ни корнем многочлена какой-нибудь разумной степени, ни простой комбинацией различных констант типа пи, е и так далее.

Иначе задача не попала бы в программирование)


Название: Re: Два бога и монетка (программирование)
Отправлено: Вилли ☂ от Июль 25, 2012, 12:03:36
хм, давай свой ответ.

А почему мой вариант не катит?

давай так:
Показать скрытый текст


Название: Re: Два бога и монетка (программирование)
Отправлено: Sirion от Июль 25, 2012, 12:51:12
батенька, во-первых, это не доказательство
во-вторых, задачи выкладываются для того, чтобы ответы на них давали другие)


Название: Re: Два бога и монетка (программирование)
Отправлено: Sirion от Июль 25, 2012, 13:00:56
а не так?  :tomato:

P(n) = 0 + 1/2 + 0 + 1/8 + 0 + ... (1/2)^n,    n = 2k-1

P(1) = 0
P(2) = 50%
P(4) = 62,5%
...
P = 2/3

(http://latex.codecogs.com/gif.latex?\sum_{n=1}^{\infty } \frac{1}{2^{2n-1}})


Нет, неправильно.
В P(4) встречаются случаи из P(2), значит ты их посчитал 2 раза, надо 1 раз их вычесть.
Если P(2,4) - вероятность того что последовательность попала под случай 2 и случай 4, то
P(2) + P(4) - P(2,4)
И т.д. Например
P(2) + P(4) + P(6) -
- P(2,4) - P(2,6) - P(4,6) +
+ P(2,4,6)
Не уверен что это решается.

Вот как бы да, необходимо учитывать этот эффект


Название: Re: Два бога и монетка (программирование)
Отправлено: Michael от Июль 25, 2012, 14:02:58
P(n) - вероятность выиграть за n ходов.  :whiteflag:

P(1) = 0                         // один раз бросили, нечетное, никакой симетрии
P(2) = 1/2                      // два раза бросали (ОО, РР, РО, ОР). вероятность выиграть 2 из 4-х = 50%
далее может вероятность только расти ("вероятность выиграть за n ходов")

P(3) = 1/2                      // три раза бросали. Нечётное-> на этом ходе не выиграем.
                                      // Вероятность не выросла.
                                      // П.С. тут важно, что выпало, но это посчитаем на след ходе  :-[

P(4) = 1/2 + 1/8            //  РООО,РООР (при Р=1/8),  РОРО,РОРР (при Р=1/8)
                                     //  или ОРОО,ОРОР (при Р=1/8) ,ОРРО,ОРРР (при Р=1/8)
                                     //  т.е.       P(4) = P(3) + (1/2) * (1/8) + (0) * (1/8)
                                     //               + (0) * (1/8) + (1/2) * (1/8) = 1/2 + 1/8 = 0,625 (62,5%)

Показать скрытый текст

и т.д.

Р = 2/3  (~66,67%)
откуда следует твоё "и т.д."?

P(2)=1/2
P(4)=1/8
P(6)=1/16
P(8 )=3/32

А запрограммировать легко, в чём прикол?


Название: Re: Два бога и монетка (программирование)
Отправлено: Вилли ☂ от Июль 25, 2012, 14:27:14
откуда следует твоё "и т.д."?
я надеялся каждый сможет накинуть пару "О","Р" и посчитать

P(2)=1/2
P(4)=1/8
P(6)=1/16
P(8 )=3/32
вообще-то
(1/2)^5 не есть 3/32  :no2:


Нет, неправильно.
В P(4) встречаются случаи из P(2), значит ты их посчитал 2 раза, надо 1 раз их вычесть.
Вот как бы да, необходимо учитывать этот эффект
это как раз и учитывалось. Например здесь:

напоминаю:  P(n) - вероятность выиграть за n ходов.  :whiteflag:

P(4) = 1/2 + 1/8            //  РООО,РООР (при Р=1/8),  РОРО,РОРР (при Р=1/8)
                                     //  или ОРОО,ОРОР (при Р=1/8) ,ОРРО,ОРРР (при Р=1/8)
                                     //  т.е.       P(4) = P(3) + (1/2) * (1/8) + (0) * (1/8)
                                     //               + (0) * (1/8) + (1/2) * (1/8) = 1/2 + 1/8 = 0,625 (62,5%)






ну не знаю.
если еще поразмыслить,  :-\
получается еще большая вероятность  :laugh:

Показать скрытый текст


Название: Re: Два бога и монетка (программирование)
Отправлено: Sirion от Июль 25, 2012, 14:30:49
Michael, ну так запрограммируйте, если легко)

Вилли ☂, ещё поразмыслить - это как раз то, что нужно


Название: Re: Два бога и монетка (программирование)
Отправлено: Вилли ☂ от Июль 25, 2012, 16:30:12
Давайте по-пунктам  :show_heart:
 а) при первом броске какова вероятность выиграть? P(1) = 0

 б) при втором броске какова вероятность выиграть? P(2) = 1/2
    видно из:
 ОО +
 ОР -
 РО -
 РР+

 в) при третьем броске какова вероятность выиграть?
    смотрим:
 Показать скрытый текст
4/8 те пункты, когда выиграли (на 2-ом бросании).
Итого P(3) = P(2) [иначе быть не могло] = 1/2   

г) при четвёртом броске какова вероятность выиграть?
    смотрим все варианты:
 Показать скрытый текст
10/16 те пункты, когда выиграли (не важно на 2-ом либо 4-ом бросании).
Итого P(4) = 5/8 



есть возражения по какому-либо пункту? Прошу комментировать и аргументировать  :read:


Таки нет. Вероятность, которую я вычислил, ...
Покажи, пожалуйста, (под спойлером) ту вероятность, которую ты вычислил. Хотя-бы до 2-ого знака. Уж очень интересно.
 


Название: Re: Два бога и монетка (программирование)
Отправлено: Sirion от Июль 25, 2012, 16:37:46
Возражений нет, Вы успешно вычислили вероятность того, что первый бог выиграет не позже второго хода. Дальше тоже будете считать руками? =)

Свой ответ выложу позже, программа осталась дома.


Название: Re: Два бога и монетка (программирование)
Отправлено: Вилли ☂ от Июль 25, 2012, 16:44:58
Возражений нет, Вы успешно вычислили вероятность того, что первый бог выиграет не позже второго хода. Дальше тоже будете считать руками? =)

Свой ответ выложу позже, программа осталась дома.
вроде я расписал всё вплоть до 4-ого броска (а,б,в,г)

А решение (и формулу) привёл в самом первом посте.
P = 2/3

(http://latex.codecogs.com/gif.latex?\sum_{n=1}^{\infty } \frac{1}{2^{2n-1}})


Название: Re: Два бога и монетка (программирование)
Отправлено: moonlight от Июль 25, 2012, 21:38:07
Показать скрытый текст


Название: Re: Два бога и монетка (программирование)
Отправлено: Sirion от Июль 26, 2012, 10:38:07
Показать скрытый текст
что-то в этом районе, да
чёрт, я так и забыл дома посмотреть свою прогу
придётся на работе переписывать её заново


Название: Re: Два бога и монетка (программирование)
Отправлено: Вилли ☂ от Июль 26, 2012, 17:26:47
Перечитал / передумал / пересчитал


N =     4    8     10     12     14
ok =    10   182   738    2972   11924
2^N     16   256   1024   4096   16384

P =     0,625   0,7109375   0,720703125   0,725585938   0,727783203  ...

набросал программку, посчитал для 4,8,10,12,14

варианта для 18 не дождался  :(


Название: Re: Два бога и монетка (программирование)
Отправлено: moonlight от Июль 27, 2012, 12:56:58
для N=10 должно быть ok=740.

Показать скрытый текст

сколько точных цифр здесь?
Показать скрытый текст


Название: Re: Два бога и монетка (программирование)
Отправлено: Michael от Июль 27, 2012, 18:52:07
Вероятность, которую я вычислил, не выражается ни рациональным числом, ни корнем многочлена какой-нибудь разумной степени, ни простой комбинацией различных констант типа пи, е и так далее.
Sirion, можно с этого места поподробнее? На каком знаке после запятой вы поняли что ответ - иррациональное число?:)


Название: Re: Два бога и монетка (программирование)
Отправлено: Вилли ☂ от Июль 31, 2012, 09:50:28
Sirion, можно с этого места поподробнее? На каком знаке после запятой вы поняли что ответ - иррациональное число?:)

 :whiteflag: :whiteflag: :whiteflag:
 навено сразу после того, как перебрал все комбинации иррациональных чисел со всеми возможными коэфф.
простой комбинацией различных констант типа пи, е и так далее.
Показать скрытый текст


Название: Re: Два бога и монетка (программирование)
Отправлено: Sirion от Июль 31, 2012, 13:16:40
Пардоньте, я как-то совсем позабыл про эту тему.

Есть такая штука как Inverse Symbolic Calculator (http://en.wikipedia.org/wiki/Inverse_Symbolic_Calculator)
Он занимается как раз тем, что пытается представить данный ему огрызок десятичной дроби в какой-нибудь удобоваримой форме. Если это ему не удаётся - либо такой формы нет, либо она ну очень экзотична.


Название: Re: Два бога и монетка (программирование)
Отправлено: Крипто от Июль 31, 2012, 13:50:35
Один вопросик. Две решки(орла) считаются за выигрыш?


Название: Re: Два бога и монетка (программирование)
Отправлено: Sirion от Июль 31, 2012, 14:52:59
Конечно.


Название: Re: Два бога и монетка (программирование)
Отправлено: Michael от Июль 31, 2012, 19:18:33
:whiteflag: :whiteflag: :whiteflag:
 навено сразу после того, как перебрал все комбинации иррациональных чисел со всеми возможными коэфф.
Показать скрытый текст
:good2:


Название: Re: Два бога и монетка (программирование)
Отправлено: Sirion от Август 06, 2012, 21:15:04
Я наконец восстановил свою программу для вычисления этой замечательной константы. С точностью до пятидесятого знака ответ будет таков: 0.73221315978211088762332859641569744744494010200652

Дело за малым: найти оставшиеся 50 знаков =)


Название: Re: Два бога и монетка (программирование)
Отправлено: nikenbiraki от Ноябрь 06, 2012, 12:27:14
 Нечетные броски не рассматриваем так как там вероятность выиграть равна 0

 1) при втором броске какова вероятность выиграть? P(2) = 1/2
 00 +
 01  -
 10  -
 11 +

 2) при четвёртом броске какова вероятность выиграть?
    если мы дошли до 4-того броска, значит все броски которые начинаются на 00 и 11 не учитываюся,
    потому что при этой комбинации 1 Бог победил еще на 2-ром ходу, отметим их - Х
 0000 - Х
 0001 - Х
 0010 - Х
 0011 - Х
 0100 -   
 0101 -
 0110 +
 0111 -   
 1000 -   
 1001 +
 1010 -
 1011 -
 1100 - Х
 1101 - Х
 1110 - Х
 1111 - Х
 
в итоге мы имеем 2/8 или 1/4

общая вероятность P = 1/2 + 1/4 + 1/8 + 1/16...
имеем постоянно убывающую геометрическую прогрессию с шагом q = 1/2
отсюда P = a1/(1-q) = 1/2 / (1 - 1/2) = 1


Название: Re: Два бога и монетка (программирование)
Отправлено: moonlight от Ноябрь 08, 2012, 19:03:16
0.732213159782110887623328596415697447444940102006515467923688111488785062214767237146455237761438631565335535527926688493123532836185728551458374365759707361061655972809445525900795420589049620282341598430708923525303042807548570712970037195261212195505272635147682786948793428753806739533378445773745345130443339309589692047442056467983324001761331083220327296899993701875189789987780133622909994268036837375633998745553095937881589712132192693099685036472780214468103987151935274781431258740853431445056096788808597662346767893412136912448746151355748364219765425540684775010082521870787413246694802826712932857153018100521858985756151604661758114333096618412044119583625317403601306288387093670905509644765691949093095595105891799813325452902328612000002474753252261999712080821735949194356995031511257200309343432766773845524095313739622200415283372264417243426008799665580893511601663080405825460074367131500665169761553587998978250978219909647109046775279413513153773766470816893375084753656772


Название: Re: Два бога и монетка (программирование)
Отправлено: Sirion от Декабрь 03, 2012, 15:55:44
И действительно, таки ня.


Название: Re: Два бога и монетка (программирование)
Отправлено: mayer от Декабрь 04, 2012, 10:12:58
И действительно, таки ня.

 ключ  к Пентагону найден  :D


Название: Re: Два бога и монетка (программирование)
Отправлено: dimon3454 от Март 17, 2013, 10:11:39
Но тут вмешался я и что у меня получилось:-)
A-кол-во бросков n1-решка n2 - орел
Если А=(например)10 то казалось бы вероятность 50/50( n1/n2) НО если это английская монетка то ученые доказали что вероятность равна 67.2/32.8 и даже вычисляем:
 n1 : n2 дальше сами:-)


Название: Re: Два бога и монетка (программирование)
Отправлено: пестерь от Март 17, 2013, 10:28:32
Но тут вмешался я и что у меня получилось:-)
A-кол-во бросков n1-решка n2 - орел
Если А=(например)10 то казалось бы вероятность 50/50( n1/n2) НО если это английская монетка то ученые доказали что вероятность равна 67.2/32.8 и даже вычисляем:
 n1 : n2 дальше сами:-)
в условии монета симметричная


Название: Re: Два бога и монетка (программирование)
Отправлено: ☭-Изделие 20Д от Март 17, 2013, 16:07:20
Но тут вмешался я и что у меня получилось:-)
A-кол-во бросков n1-решка n2 - орел
Если А=(например)10 то казалось бы вероятность 50/50( n1/n2) НО если это английская монетка то ученые доказали что вероятность равна 67.2/32.8 и даже вычисляем:
 n1 : n2 дальше сами:-)
А что если одну сторону монетки намазать маслом ??? - заодно закроем закон бутерброда. :cool3:


Название: Re: Два бога и монетка (программирование)
Отправлено: or0ez от Декабрь 23, 2019, 11:13:09
программа на С.
число вычисляемых знаков пропорционально N:(2.4*N).

Код:
#include <stdio.h>
#include <stdlib.h>

#define N 500
#define u16 unsigned short
#define u32 unsigned

typedef struct{u16 q[N];short nz;}u16N;
typedef struct{u16N u0,u1;}u16N2;

u16N new16N(){u16N a;for(int i=0;i<N;i++)a.q[i]=0;a.nz=0;return a;}

u16N toU16N(u32 n){u16N a=new16N();a.q[0]=n;a.q[1]=(n>>16);a.nz=a.q[1]?2:(a.q[0]?1:0);return a;}

u16N sum(u16N a,u16N b){
    int m=a.nz>=b.nz?a.nz:b.nz;
    u16N s=new16N();
    u32 c=0;
    for(int i=0;i<m;i++){u32 t=c+a.q[i]+b.q[i];s.q[i]=t;c=t>>16;}
    if(c&&m<N)s.q[m]=1;
    s.nz=nZ(s.q);
    return s;
}

u16N inv(u16N a){
    u16N b;
    for(int i=0;i<N;i++)
    b.q[i]=~a.q[i];
    b.nz=nZ(b.q);
    return b;
}

u16N subt(u16N a, u16N b){return sum(a,sum(inv(b),toU16N(1)));}

int nZ(u16 q[N]){int cnt=N;for(int i=N-1;i>=0;i--)if(q[i])break;else cnt--;return cnt;}

u16N shL0(u16N a,int n){
    u16N b=new16N();
    u16 c=0;
    for(int i=0;i<a.nz;i++){u32 r=c|((u32)a.q[i]<<n);b.q[i]=r;c=r>>16;}
    if(a.nz<N)b.q[a.nz]=c;
    b.nz=nZ(b.q);
    return b;
}

u16N shL(u16N a,int n){
    u16N b=shL0(a,n&0xf);
    int n1=n>>4;
    if(n1)for(int i=a.nz;i>=0;i--){int j=i+n1;if(j<N)b.q[j]=b.q[i];if(i<N)b.q[i]=0;}
    b.nz=nZ(b.q);
    return b;
}

u16N shR(u16N a){
    u16N b=new16N();
    for(int i=a.nz-1;i>=0;i--){u32 u=(i==a.nz-1?0:a.q[i+1]);u32 w=(u<<16)|a.q[i];b.q[i]=(w>>1);}
    b.nz=nZ(b.q);
    return b;
}

int max1(u16N a){
    int k=-1;
    if(a.nz){for(int i=15;i>=0;i--)if((a.q[a.nz-1]>>i)&1){k=i;break;}k+=(a.nz-1)<<4;}
    return k;
}

int cmp(u16N a, u16N b){
    int s=a.nz-b.nz;
    if(s)return s;
    for(int i=a.nz-1;i>=0;i--)if(s=a.q[i]-b.q[i])return s;
    return 0;
}

void show10(u16N a, u16N b){
    u16 m[N];
    for(int i=N-1;i>=0;i--){
        u16 r=0;
        for(int j=0;j<16;j++){
            b=shR(b);
            r<<=1;
            if(cmp(a,b)>=0){a=subt(a,b);r|=1;}
        }
        m[i]=r;
    }
    int n=(int)(N*0.6);
    u16 d[n];
    int cnt=0;
    int k=0;
    while(k<N&&cnt<n){
        u32 c=0;
        for(int i=k;i<N;i++){
            u32 t=(u32)10000*m[i]+c;
            m[i]=t;
            c=t>>16;
        }
        d[++cnt-1]=c;
        for(int i=k;i<N;i++)
            if(!m[i]){k=i;break;}
    }
    for(int i=0;i<cnt;i++){printf(" %04d",d[i]);if((i+1)%15==0)printf("\n");}
    printf("\n");
}

u16N fn(int n,u16N*p){
    if(n>1){
        p[n]=shL(p[n-1],1);
        if(!(n&1))p[n]=subt(p[n],p[n>>1]);
    }
    return p[n];
}

int main()
{
    int size=N<<3;
    u16N* a=(u16N*)malloc(size*sizeof(u16N));
    a[0]=toU16N(0);a[1]=toU16N(1);
    u16N numin=toU16N(0);
    int i=0;
    while(i<size-1&&(N<<4)-max1(numin)>4)
        numin=sum(shL0(numin,2),fn(++i,a));
    u16N denom=shL(toU16N(1),i+i-1);
    show10(numin,denom);
    return 0;
}