/* Start of file BBallC.C */
char name[]="BBallC - Baseball probability (if each game is a 50-50 chance).";
char version[]="C Version 2.04, last revised: 1994-02-13, 0600 hour";
char author[] ="Copyright (c) 1981-1994 by author: Harry J. Smith,";
char address[]="19628 Via Monte Dr., Saratoga CA 95070. All rights reserved.";
/* Computes the probability that the 1st place team will beat the 2nd place
* team for the division title, assuming each has a 50-50 chance of winning
* any given future game. Uses a bivariate binomial distribution as a model.
*/
/* Developed in Turbo Pascal 5.0, converted to
* C subset of Borland C++ Version 4.0
*/
#include <stdio.h> /* Definitions for stream input/output */
#include <math.h> /* Definitions for the math floating point package */
#include <conio.h> /* Direct MS-DOS console input/output, getch() */
#include <stdlib.h> /* Definition of exit() etc. */
#include <string.h> /* Definition of srtcpy() etc. */
#define DEBUG
#undef DEBUG
/* Global constants and variables */
const char ESC = 27;
char TN1[11]; /* Team's name, 1st place team */
char TN2[11]; /* Team's name, 2nd place team */
int GL1; /* Games Left to play, 1st place team */
int GL2; /* Games Left to play, 2nd place team */
int GE; /* Games to play each other */
double GA; /* Games 1st place team is ahead. 0, 0.5, ... */
int GA2; /* Twice games ahead = 2 * GA, 0, 1, ... */
int MNT1; /* Magic Number to tie for 1st place team */
int MNW1; /* Magic Number to win for 1st place team */
int MNT2; /* Magic Number to tie for 2nd place team */
int MNW2; /* Magic Number to win for 2nd place team */
double P; /* Probability that 1st place team beats 2nd place team */
double Q; /* Probability that 2nd place team beats 1st place team */
char Ch;
/* Procedure prototypes */
void init( void); /* Initialize */
void GetCase( void); /* Get data for a case to compute */
void ExpandCase( void); /* Compute related data */
void DisplayCase( void);
void ComputeProb( void); /* Compute probability using a bivariate binomial
distribution as a model */
void DisplayProb( void); /* Display probability */
void ReadInt( char *Mess, int Min, int Max, int Nom,
int *I); /* Read in an integer from keyboard */
void ReadReal( char *Mess, double Min, double Max, double Nom,
double *I); /* Read in a Real from keyboard */
/* -------------------------------------- */
int main( void) {
do {
init();
GetCase();
ExpandCase();
ComputeProb();
init();
DisplayCase();
DisplayProb();
printf("Press any key to continue... (or ESC to exit)\n");
Ch = getch();
} while (Ch != ESC);
return 0;
} /* End of main */
/* -------------------------------------- */
void init( void) /* Initialize */
{
printf(" [1;33;44m [2J"); /* Ansi.Sys ESC seq. for YELLOW on BLUE, clrscr */
printf("\n%s\n%s\n%s\n%s\n\n", name, version, author, address);
} /* End of init */
/* -------------------------------------- */
void GetCase( void) /* Get data for a case to compute */
{
int I;
/* Giants, Braves 1993 */
strcpy( TN1, "Braves"); strcpy( TN2, "Giants");
GL1 = 6; GL2 = 7; GE = 0; GA = 1.5; /* 1993-09-27, 1 / Q = 4.7175 */
ReadInt("Games Left to play, 1st place team (-2 => Exit, -1 => Test case)",
-2, 162, -1, &I);
if (I == -2) exit(0); /* Exit main */
if (I >= 0) {
strcpy( TN1, " "); strcpy( TN2, " ");
GL1 = I;
ReadInt("Games Left to play, 2nd place team", 0, 162, GL1, &GL2);
ReadInt("Games to play each other", 0, 24, 0, &GE);
do
ReadReal("Games ahead, 0, 0.5, ...", 0, 162, 0, &GA);
while (floor( GA + GA) != GA + GA);
}
} /* End of GetCase */
/* -------------------------------------- */
void ExpandCase( void) /* Compute related data */
{
int I;
GA2 = 2 * GA + 0.5;
I = GL1 + GL2 - GA2;
if (I % 2 == 1) { /* if I is odd */
printf("Error in data\n");
printf("Press any key to continue...\n"); Ch = getch();
}
MNT1 = I / 2; MNW1 = MNT1 + 1;
MNT2 = GL1 + GL2 - MNT1; MNW2 = MNT2 + 1;
} /* End of ExpandCase */
/* -------------------------------------- */
void DisplayCase( void)
{
printf("%8d = Games Left to play, 1st place team (%s)\n", GL1, TN1);
printf("%8d = Games Left to play, 2nd place team (%s)\n", GL2, TN2);
printf("%8d = Games to play each other\n", GE);
printf("%#8.1f = Games 1st place team is ahead. 0, 0.5, ...\n", GA);
printf("%8d = Magic Number to tie for 1st place team\n", MNT1);
printf("%8d = Magic Number to win for 1st place team\n", MNW1);
printf("%8d = Magic Number to tie for 2nd place team\n", MNT2);
printf("%8d = Magic Number to win for 2nd place team\n\n", MNW2);
} /* End of DisplayCase */
/* -------------------------------------- */
void ComputeProb( void) /* Compute probability using a bivariate binomial
distribution as a model */
{
int I, J;
double A, B;
double E[25]; /* Binomial coefficients, games to play each other */
double S[25]; /* Running sum of 2 * E[I] */
double F[163]; /* B. C., games not played with each other */
double G[163]; /* Sum of 2 * E[I] for 2nd place team win, E[I] for tie */
A = GL1 + GL2 - GE - GE; /* A = not played with each other games */
B = 1.0;
F[0] = 1.0;
for (I = 1; I <= MNT1; I++) { /* Compute binomial coefficients */
F[I] = F[I - 1] * A / B;
A = A - 1.0;
B = B + 1.0;
}
A = GE;
B = 1.0;
E[0] = 1.0;
S[0] = 2.0;
for (I = 1; I <= GE; I++) { /* Compute binomial coefficients */
E[I] = E[I - 1] * A / B;
A = A - 1.0;
B = B + 1.0;
S[I] = S[I - 1] + 2 * E[I];
}
for (I = 0; I <= MNT1; I++) { /* Compute G[I] */
J = (MNT1 - I) / 2;
if (J <= GE) {
G[I] = S[J];
if ((J + J) == (MNT1 - I)) G[I] = G[I] - E[J]; /* Adjust for tie */
}
else
G[I] = S[GE];
}
#ifdef DEBUG
DisplayCase();
for (I = 0; I <= MNT1; I++) {
printf("F[%d] = %.0f\n", I, F[I]);
}
printf("\nPress any key to continue...\n"); Ch = getch();
printf("\n");
for (I = 0; I <= GE; I++) {
printf("E[%d] = %.0f\n", I, E[I]);
}
printf("\nPress any key to continue...\n"); Ch = getch();
printf("\n");
for (I = 0; I <= GE; I++) {
printf("S[%d] = %.0f\n", I, S[I]);
}
printf("\nPress any key to continue...\n"); Ch = getch();
printf("\n");
for (I = 0; I <= MNT1; I++) {
printf("G[%d] = %.0f\n", I, G[I]);
}
printf("\nPress any key to continue...\n"); Ch = getch();
printf("\n");
#endif
Q = 0.0; /* Compute probability that 2nd place team beats 1st place team */
for (I = 0; I <= MNT1; I++) {
Q = Q + F[I] * G[I];
}
A = GL1 + GL2 - GE + 1;
B = pow( 2.0, A); /* 2 ** Flips */
Q = Q / B;
P = 1.0 - Q;
} /* End of ComputeProb */
/* -------------------------------------- */
void DisplayProb( void) /* Display probability */
{
printf(
"%#10.4f = P = Probability that 1st place team beats 2nd place team\n", P);
printf(
"%#10.4f = Q = Probability that 2nd place team beats 1st place team\n", Q);
if (Q > 0.0)
printf("%#10.4f = 1 / Q, (Odds = %1.4f : 1)\n", 1.0 / Q, P / Q);
printf("\n");
} /* End of DisplayProb */
/* -------------------------------------- */
void ReadInt( char *Mess, int Min, int Max, int Nom, int *I) /* Read in an
integer from keyboard */
{
char St[129];
char *ior;
int Stat;
long int LI;
do {
do {
printf("%s\n", Mess);
printf(" [%d, %d] (ENTER => %d): ", Min, Max, Nom);
ior = gets( St);
} while (ior == NULL);
Stat = sscanf( St, "%ld", &LI);
} while (!(((Stat == 1) && (LI >= Min) && (LI <= Max)) || (St[0] == 0)));
if (St[0] == 0) LI = Nom;
*I = (int) LI;
printf("Input = %d\n\n", *I);
} /* End of ReadInt */
/* -------------------------------------- */
void ReadReal( char *Mess, double Min, double Max, double Nom,
double *R) /* Read in a Real from keyboard */
{
char St[129];
char *ior;
int Stat;
do {
do {
printf("%s\n", Mess);
printf(" [%.1lf, %.1lf] (ENTER => %.1lf): ", Min, Max, Nom);
ior = gets( St);
} while (ior == NULL);
Stat = sscanf( St, "%lf", R);
} while (!(((Stat == 1) && (*R >= Min) && (*R <= Max)) || (St[0] == 0)));
if (St[0] == 0) *R = Nom;
printf("Input = %.1lf\n\n", *R);
} /* End of ReadReal */
/* End of file BBallC.C */