Member 13644023 Ответов: 0

Пример : дополнительные очки в футболе (вероятностные стратегии игры и обратная индукция)


Приведенный выше пример взят из книги "проектирование алгоритмов и приложений" Майкла т. Гудрича (номер страницы 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);

    }

0 Ответов