Пример : дополнительные очки в футболе (вероятностные стратегии игры и обратная индукция)
Приведенный выше пример взят из книги "проектирование алгоритмов и приложений" Майкла т. Гудрича (номер страницы 336-338 в текстовой книге и в pdf-файле-от 354 до 356, раздел 12.4.2)
ссылка на pdf файл
Итак, мой вопрос заключается в том, где я ошибся в расчете вероятности успеха команды а, когда ее оценка 1 очко и 2 очка после приземления, потому что результат, который я получаю, очень велик, где он должен быть 0,98 для 1 очка и 0,40 до 0,55 для преобразования 2 очка?(объяснение приведено в приведенной выше ссылке pdf)
Код, который я написал, приведен ниже :
Что я уже пробовал:
#include <stdio.h> #include <stdlib.h> #include<time.h> float fball(int k, int d, int n1); int main() { srand(time(NULL)); int n1,k=0,d=0; float f; printf("\nEnter the number of possessions : \n"); scanf("%d",&n1); f=fball(k,d,n1); return 0; } float fball(int k, int d, int n1) { int n=0,i,randomextra; int rva0,rva3,rva6,rvb0,rvb3,rvb6; //probabilities of each team after scoring fieldgoal or touchdown or no score float p1a,p2a,p1b,p2b; //probabilities of each team for success of scoring 1 or points after a touchdown int myArray[3] = {0,3,6}; int randomIndex; int randomValue; for(n=n1;n>0;n--) { if(n%2==0)//alternate chance for teams { randomIndex= rand() % 3; randomValue= myArray[randomIndex]; if(randomValue==0) //if no score { k+=randomValue; d+=randomValue; rva0++; } else if(randomValue==3) //if field goal { k+=randomValue; d+=randomValue; rva3++; } else //if touchdown { randomextra=rand() % 2 + 1; if(randomextra==1){ //if 1 point p1a=p1a*(((rvb6/100)*fball(6,d-5,n-1))+((rvb3/100)*fball(3,d-2,n-1))+((rvb0/100)*fball(0,d+1,n-1)))+(1-p1a)*(((rvb6/100)*fball(6,d-6,n-1))+((rvb3/100)*fball(3,d-3,n-1))+((rvb0/100)*fball(0,d,n-1))); } else{ //if 2 point p2a=p2a*(((rvb6/100)*fball(6,d-5,n-1))+((rvb3/100)*fball(3,d-2,n-1))+((rvb0/100)*fball(0,d+1,n-1)))+(1-p2a)*(((rvb6/100)*fball(6,d-6,n-1))+((rvb3/100)*fball(3,d-3,n-1))+((rvb0/100)*fball(0,d,n-1))); } rva6++; } } else //chance of team B { randomIndex= rand() % 3; randomValue= myArray[randomIndex]; if(randomValue==0) //if no score { k+=randomValue; d-=randomValue; rvb0++; } else if(randomValue==3) //if field goal { k+=randomValue; d-=randomValue; rvb3++; } else //if touchdown { randomextra=rand() % 2 + 1; if(randomextra==1){ //if 1 point p1b=p1b*(((rva6/100)*fball(6,d-5,n-1))+((rva3/100)*fball(3,d-2,n-1))+((rva0/100)*fball(0,d+1,n-1)))+(1-p1b)*(((rva6/100)*fball(6,d-6,n-1))+((rva3/100)*fball(3,d-3,n-1))+((rva0/100)*fball(0,d,n-1))); } else{ //if 2 point p2b=p2b*(((rva6/100)*fball(6,d-4,n-1))+((rva3/100)*fball(3,d-1,n-1))+((rva0/100)*fball(0,d+2,n-1)))+(1-p1b)*(((rva6/100)*fball(6,d-6,n-1))+((rva3/100)*fball(3,d-3,n-1))+((rva0/100)*fball(0,d,n-1))); } rvb6++; } } } printf("\np1a=%f p2a=%f p1b=%f p2b=%f\n",p1a,p2a,p1b,p2b); }