2014 dxdy logo

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

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


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


В этом разделе нельзя создавать новые темы.



Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3  След.
 
 Re: Задачу о разорении игрока
Сообщение08.06.2010, 15:30 


16/09/09
31
Я развязала эту задачу следующим образом:
uses crt;
var n,m,i,x,s,z,y,a:integer; p,q:real;
begin
clrscr;
write('kapital 1. ihroka='); readln(z);
write('kapital 2. ihroka ='); readln(y);
write('vveditj verojatnost razorenuu 1. ihroka='); readln(p);
writeln;
a:=z+y;
s:=z;
n:=0;
randomize;
repeat
n:=n+1;
x:=random(2);
write(x:4);
if (x=0) then
begin
m:=m+1;
s:=s-1;
end
else s:=s+1;
until (s=0) or (s=a);
q:=m/n;
writeln;
writeln('verojatnost razorenuu =',q:12:10);
readln;
end.

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

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение08.06.2010, 16:20 
Заслуженный участник
Аватара пользователя


13/08/08
14495
Ничего не могу сказать по синтаксису, но есть замечания по алгоритму.

У Вас цикл repeat моделирует только одну игру, состоящую из n раундов. Причём q будет крутиться около 1/2, так как это оценка(?) вероятности выигрыша первого игрока в одном раунде (броске монетки). Я бы всё же застраховался от квазизацикливания при больших начальных капиталах. Или уж не надо? Это надо программеров спросить.
А n и m нет смысла подсчитывать, разве что Вы хотите определять среднюю длительность игры. Используйте их для подсчёта выигрышей в играх, а не раундах.
Вам нужен ещё один внешний цикл, в котором Вы будете подсчитывать число выигрышей в каждой игре, которые определяются значением s в конце внутреннего цикла. Внешний цикл можно сделать переменным, а можно постоянным, 100-200 игр хватит, я думаю.

В Паскале наверняка есть real датчик СЧ от 0 до 1, если нет, то можно использовать random(100) и сравниват с вероятностью в процентах. Я думаю, точности хватит.

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 10:48 


16/09/09
31
uses crt;
var i,s,z,y,a:integer;
p,x,k,res:real;
n,m:array [1..200] of integer;
q:array [1..200] of real;
begin
clrscr;
write('kapital 1. ihroka='); readln(z);
write('kapital 2. ihroka='); readln(y);
write(' verojatnost razorennuu 1. ihroka='); readln(p);
writeln;
a:=z+y;
for i:=1 to 200 do
begin
n[i]:=0;
s:=z;
randomize;
repeat
n[i]:=n[i]+1;
x:=random;
if (x<=0.5) then
begin
x:=0;
m[i]:=m[i]+1;
s:=s-1;
end
else
begin
x:=1;
s:=s+1;
end;
until (s=0) or (s=a);
q[i]:=m[i]/n[i];
end;
k:=q[1];
for i:=2 to 200 do
k:=k+q[i];
res:=k/200;
writeln;
writeln('verojatnost razorenuu=',res:12:10);
readln;
end.

Так вы думали? Результат и так очень отличается от точного.

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 10:53 
Заслуженный участник
Аватара пользователя


18/05/06
13438
с Территории
Тэг [code] и отступы. Иначе читать невозможно.

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 10:55 


16/09/09
31
Код:
uses crt;
var i,s,z,y,a:integer;
    p,x,k,res:real;
    n,m:array [1..200] of integer;
    q:array [1..200] of real;
begin
clrscr;
write('kapital 1. ihroka='); readln(z);
write('kapital 2. ihroka='); readln(y);
write('verojatnost razorennja 1. ihroka='); readln(p);
writeln;
a:=z+y;
for i:=1 to 200 do
begin
     n[i]:=0;
     s:=z;
     randomize;
     repeat
     n[i]:=n[i]+1;
     x:=random;
     if (x<=p) then
     begin
          x:=0;
          m[i]:=m[i]+1;
          s:=s-1;
     end
     else
     begin
          x:=1;
          s:=s+1;
     end;
     until (s=0) or (s=a);
     q[i]:=m[i]/n[i];
end;
k:=q[1];
for i:=2 to 200 do
k:=k+q[i];
res:=k/200;
writeln;
writeln('verojatnost razorennja=',res:12:10);
readln;
end.

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 11:09 
Заслуженный участник
Аватара пользователя


13/08/08
14495
Я думаю, что результат уже не отличим от 0.5.
Вы не то ищете.
Во-первых, p это не результат разорения первого игрока, а вероятность его пригрыша в каждом раунде. При бросании монетки это 0.5.
То еcть Вы должны написать строку if (x<=p) then/
Но при этом ничего не делать с m.
n можете увеличивать на 1 при каждом раунде, но не обнулять перед внутренним циклом. Потом разделим на количество повторений внешнего цикла (200) и определим среднюю продолжительность игры.
Массивы не нужны. После цикла repeat определяем, проиграл ли первый игрок. Если s=0, то увеличиваем m на 1. В m количество разорений первого игрока. Потом делим на 200 и получаем искомую вероятность разорения первого игрока.
Разорение означает не проигрыш в очередном раунде, то есть при очередном бросании монетки, когда игрок проигрывает лишь ставку, а проигрыш в игре, когда от просадит все свои деньги, распахнётся, как Вы говорили.

Я так понял, что уже можно править код? :-) Отмашка сделана?

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 11:18 
Заслуженный участник
Аватара пользователя


18/05/06
13438
с Территории
Внутри repeat...until (кстати, там нужен такой же отступ, как внутри begin...end) Вы считаете что-то непонятное. Число шагов, когда первому привалило счастье, делить на общее число шагов? Зачем? Почему? Какое отношение это имеет к факту выигрыша?

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 11:34 


16/09/09
31
Код:
uses crt;
var i,s,z,y,a,m,n:integer;
    p,x,q:real;
begin
clrscr;
write('kapital 1. ihroka='); readln(z);
write('kapital 2. ihroka='); readln(y);
write('verojatnostst razorennja 1. ihroka='); readln(p);
writeln;
a:=z+y;
n:=0;
m:=0;
for i:=1 to 200 do
begin
     s:=z;
     repeat
     n:=n+1;
     x:=random;
     if (x<=p) then
     begin
          x:=0;
          s:=s-1;
     end
     else
     begin
          x:=1;;
          s:=s+1;
     end;
     until (s=0) or (s=a);
     if s=0 then m:=m+1;
end;
q:=m/200;
writeln;
writeln('verojatnost rozorennja=',q:12:10);
readln;
end.


Чего-то и так не правильное. Где ошибка?

-- Ср июн 09, 2010 12:44:25 --

Уже работает. Благодарю.

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 11:54 
Заслуженный участник
Аватара пользователя


13/08/08
14495
Код:
uses crt;
var i,s,z,y,a,m,n:integer;
    p,x,q:real;
begin
clrscr;
write('kapital 1. ihroka='); readln(z);
write('kapital 2. ihroka='); readln(y);
write('verojatnostst proigrysha 1. ihroka='); readln(p);
writeln;
a:=z+y;
n:=0;
m:=0;
for i:=1 to 200 do
begin
     s:=z;
     repeat
          n:=n+1;
          x:=random;
          if (x<=p) then
                 s:=s-1;
          else
              s:=s+1;
     until (s=0) or (s=a);
     if s=0 then m:=m+1;
end;
q:=m/200;
writeln;
writeln('verojatnost rozorennja=',q:12:10);
readln;
end.


Я выкинул лишние присвоения x=0 и x=1


Вроде бы всё нормально. А что получается, если взять p=0.5; z=y=6?

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 11:58 


16/09/09
31
Тогда 0,53. Правда?

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 12:00 
Заслуженный участник
Аватара пользователя


13/08/08
14495
Ну это близко к верному значению 0.5.
Теперь посчитайте при
p=0.5; z=6; y=3;
p=0.5; z=3; y=6;
p=0.1; z=6; y=6;
p=0.9; z=6; y=6;

Можно ещё вывести n/200 - среднюю продолжительность игры.

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

При вводе параметров выводите хоть приглашение.

"Решение задачи о разорении игрока.
Введите начальный капитал первого игрока
Введите начальный капитал второго игрока
Введите вероятность проигрыша первого игрока при очередном шаге игры"

Хотя зависит от преподавателя. Некоторые наоборот не любят излишнее украшательство.

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 12:21 


16/09/09
31
p=0.5; z=6; y=3; тогда 0,33
p=0.5; z=3; y=6; тогда 0,66
p=0.1; z=6; y=6; тогда 0
p=0.9; z=6; y=6; тогда 1

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 12:27 
Заслуженный участник
Аватара пользователя


13/08/08
14495
Ну вот, это соответствут ожиданиям, хотя слишком ровные числа получаются.
Теперь увеличьте размеры капиталов.
Ну хотя бы
p=0.5; z=12; y=9;
p=0.5; z=12; y=12;
p=0.5; z=12; y=15;
Можно увеличить количество игр . Не 200, а 500, хотя это уже лишнее.
А есть точная формула для вероятности разорения?

-- Ср июн 09, 2010 13:34:14 --

Как в паскале происходит деление целых при присвоении результата переменной real? Может быль стоит выводить 6 знаков q?

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 12:44 
Заслуженный участник
Аватара пользователя


18/05/06
13438
с Территории
Деление в паскале происходит нормально.
Влепите в начало randomize.

 Профиль  
                  
 
 Re: Задачу о разорении игрока
Сообщение09.06.2010, 12:55 
Заслуженный участник
Аватара пользователя


13/08/08
14495
Так он же был, вроде, Randomize? Ушёл, что ли?
Вообще, я бы выводил среднюю продожительность игры и последил, как она увеличивается при возрастании начальных капиталов.
Конечно, по теории игра рано или поздно закончится, но программа может работать очень долго. Может быть и лишнее это, но тут надо либо на входе отбивать слишком большие капиталы обоих игроков, либо как-то принудительно заканчивать внутренний цикл и не учитывать его.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 43 ]  На страницу Пред.  1, 2, 3  След.

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



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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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