'Start of file BBallQ.Bas **************************************************
DECLARE SUB ReadInt (Mess AS STRING, Min AS INTEGER, Max AS INTEGER, Nom AS INTEGER, I AS INTEGER)
'Read in an integer
DECLARE SUB ReadReal (Mess AS STRING, Min AS DOUBLE, Max AS DOUBLE, Nom AS DOUBLE, R AS DOUBLE)
'Read in a Real number
Name$ = "BBallQ - Baseball probability (if each game is a 50-50 chance)."
Version$ = "QuickBASIC Version 2.03, last revised: 1993-09-27, 0600 hours"
Author$ = "Copyright (c) 1981-1993 by author: Harry J. Smith,"
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 QuickBASIC 4.5
'Global variables:
ESC$ = CHR$(27)
DIM TN1 AS STRING 'Team's name, 1st place team
DIM TN2 AS STRING 'Team's name, 2nd place team
DIM GL1 AS INTEGER 'Games Left to play, 1st place team
DIM GL2 AS INTEGER 'Games Left to play, 2nd place team
DIM GE AS INTEGER 'Games to play each other
DIM GA AS DOUBLE 'Games 1st place team is ahead. 0, 0.5, ...
DIM GA2 AS INTEGER 'Twice games ahead = 2 * GA, 0, 1, ...
DIM MNT1 AS INTEGER 'Magic Number to tie for 1st place team
DIM MNW1 AS INTEGER 'Magic Number to win for 1st place team
DIM MNT2 AS INTEGER 'Magic Number to tie for 2nd place team
DIM MNW2 AS INTEGER 'Magic Number to win for 2nd place team
DIM P AS DOUBLE 'Probability that 1st place team beats 2nd place team
DIM Q AS DOUBLE 'Probability that 2nd place team beats 1st place team
DIM Ch$(1) 'Character
DIM Debug AS INTEGER '<> 0 if debug turned on
'--------------------------------------
'Main program, BBallQ
Debug = 0
DO
GOSUB Init
GOSUB GetCase
GOSUB ExpandCase
GOSUB ComputeProb
GOSUB Init
GOSUB DisplayCase
GOSUB DisplayProb
PRINT "Press any key to continue... (or ESC to exit)";
Ch$ = INPUT$(1)
LOOP UNTIL Ch$ = ESC$
END
'End Main program, BBallQ
'--------------------------------------
Init: 'Initialize program
COLOR 14, 1 'Yellow on Blue
CLS
PRINT
PRINT Name$
PRINT Version$
PRINT Author$
PRINT Address$
PRINT
RETURN 'Init
'--------------------------------------
GetCase: 'Get data for a case to compute
DIM I AS INTEGER
' Giants, Braves 1993
TN1 = "Braves": TN2 = "Giants"
GL1 = 6: GL2 = 7: GE = 0: GA = 1.5 '1993-09-27, 1 / Q = 4.7175
St$ = "Games Left to play, 1st place team (-2 => Exit, -1 => Test case)"
CALL ReadInt(St$, -2, 162, -1, I)
IF I = -2 THEN END
IF I >= 0 THEN
TN1 = " ": TN2 = " "
GL1 = I
CALL ReadInt("Games Left to play, 2nd place team", 0, 162, GL1, GL2)
CALL ReadInt("Games to play each other", 0, 24, 0, GE)
DO
CALL ReadReal("Games ahead, 0, 0.5, ...", 0, 162#, 0, GA)
LOOP UNTIL (INT(GA + GA) = GA + GA)
END IF
RETURN 'GetCase
'--------------------------------------
ExpandCase: 'Compute related data
GA2 = CINT(2 * GA) 'Round
I = GL1 + GL2 - GA2
IF (I MOD 2 = 1) THEN 'if I is odd
PRINT "Error in data"
PRINT "Press any key to continue...": Ch$ = INPUT$(1)
END IF
MNT1 = INT(I / 2): MNW1 = MNT1 + 1
MNT2 = GL1 + GL2 - MNT1: MNW2 = MNT2 + 1
RETURN 'ExpandCase
'--------------------------------------
DisplayCase:
PRINT USING "########"; GL1;
PRINT " = Games Left to play, 1st place team ("; TN1; ")"
PRINT USING "########"; GL2;
PRINT " = Games Left to play, 2nd place team ("; TN2; ")"
PRINT USING "########"; GE; : PRINT " = Games to play each other"
PRINT USING "######.#"; GA; : PRINT " = Games 1st place team is ahead. 0, 0.5, ..."
PRINT USING "########"; MNT1; : PRINT " = Magic Number to tie for 1st place team"
PRINT USING "########"; MNW1; : PRINT " = Magic Number to win for 1st place team"
PRINT USING "########"; MNT2; : PRINT " = Magic Number to tie for 2nd place team"
PRINT USING "########"; MNW2; : PRINT " = Magic Number to win for 2nd place team"
PRINT
RETURN 'DisplayCase
'--------------------------------------
ComputeProb: 'Compute probability using a bivariate binomial
'distribution as a model
' DIM I AS INTEGER
DIM J AS INTEGER
DIM A AS DOUBLE
DIM B AS DOUBLE
DIM E(0 TO 24) AS DOUBLE 'Binomial coefficients, games to play each other
DIM S(0 TO 24) AS DOUBLE 'Running sum of 2 * E[I]
DIM F(0 TO 162) AS DOUBLE 'B. C., games not played with each other
DIM G(0 TO 162) AS DOUBLE '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
F(0) = 1
FOR I = 1 TO MNT1 'Compute binomial coefficients
F(I) = F(I - 1) * A / B
A = A - 1
B = B + 1
NEXT I
A = GE
B = 1
E(0) = 1
S(0) = 2
FOR I = 1 TO GE 'Compute binomial coefficients
E(I) = E(I - 1) * A / B
A = A - 1
B = B + 1
S(I) = S(I - 1) + 2 * E(I)
NEXT I
FOR I = 0 TO MNT1 'Compute G[I]
J = INT((MNT1 - I) / 2)
IF J <= GE THEN
G(I) = S(J)
IF (J + J) = (MNT1 - I) THEN G(I) = G(I) - E(J) ELSE 'Adjust for tie
ELSE
G(I) = S(GE)
END IF
NEXT I
IF Debug THEN
GOSUB DisplayCase
FOR I = 0 TO MNT1
PRINT "F["; I; "] = "; F(I)
NEXT I
PRINT
PRINT "Press any key to continue...": Ch$ = INPUT$(1)
PRINT
FOR I = 0 TO GE
PRINT "E["; I; "] = "; E(I)
NEXT I
PRINT
PRINT "Press any key to continue...": Ch$ = INPUT$(1)
PRINT
FOR I = 0 TO GE
PRINT "S["; I; "] = "; S(I)
NEXT I
PRINT
PRINT "Press any key to continue...": Ch$ = INPUT$(1)
PRINT
FOR I = 0 TO MNT1
PRINT "G["; I; "] = "; G(I)
NEXT I
PRINT
PRINT "Press any key to continue...": Ch$ = INPUT$(1)
PRINT
END IF 'Debug
Q = 0
FOR I = 0 TO MNT1 'Compute probability that 2nd place team beats 1st place team
Q = Q + F(I) * G(I)
NEXT I
A = GL1 + GL2 - GE + 1
B = EXP(A * LOG(2#)) '2 ** Flips (natural log)
Q = Q / B
P = 1 - Q
RETURN 'ComputeProb
'--------------------------------------
DisplayProb: 'Display probability
PRINT USING "#####.####"; P;
PRINT " = P = Probability that 1st place team beats 2nd place team"
PRINT USING "#####.####"; Q;
PRINT " = Q = Probability that 2nd place team beats 1st place team"
IF Q > 0 THEN
PRINT USING "#####.####"; 1 / Q;
PRINT " = 1 / Q, (Odds = ";
PRINT USING "#.####"; P / Q;
PRINT " : 1)"
END IF
PRINT
RETURN 'DisplayProb
'--------------------------------------
SUB ReadInt (Mess AS STRING, Min AS INTEGER, Max AS INTEGER, Nom AS INTEGER, I AS INTEGER)
'Read in an integer from keyboard
DIM LI AS LONG
DO
PRINT Mess
PRINT " ["; Min; ","; Max; "] (ENTER => "; Nom;
INPUT "): ", St$
LI = VAL(St$)
LOOP UNTIL ((LI >= Min) AND (LI <= Max)) OR (St$ = "")
IF St$ = "" THEN LI = Nom
I = LI
PRINT "Input = "; I
PRINT
END SUB 'ReadInt
'--------------------------------------
SUB ReadReal (Mess AS STRING, Min AS DOUBLE, Max AS DOUBLE, Nom AS DOUBLE, R AS DOUBLE)
'Read in a Real from keyboard
DO
PRINT Mess
PRINT " ["; : PRINT USING "#.#"; Min; : PRINT ", ";
PRINT USING "###.#"; Max; : PRINT "] (ENTER => ";
PRINT USING "#.#"; Nom;
INPUT "): ", St$
R = VAL(St$)
LOOP UNTIL ((R >= Min) AND (R <= Max)) OR (St$ = "")
IF St$ = "" THEN R = Nom
PRINT "Input = "; : PRINT USING "###.#"; R
PRINT
END SUB 'ReadReal 'End of file BBallQ.Bas *************************************