MODULE DiceTest; (* -- Test of dice rolling. John W. Fort 24 Mar 87 I got a little suspicious when my game of Backgammon on a VIC-20 never rolled me a double 4 (my favorite) in six months of play, so I checked out the way the dice were rolled and found there were several other dice pairs that would never occur in the first 100 rolls. I may not be a hot shot, but I want a fair chance! *) FROM InOut IMPORT WriteString, WriteReal, WriteLn, Write, WriteCard; FROM Terminal IMPORT ClearScreen, GotoXY, Highlight, Normal; FROM MathLib IMPORT Random; FROM Utility IMPORT AnyKeyMsg; (* Appended to end of this file *) CONST COUNT = 200; VAR freq1, freq2 : ARRAY[0..5] OF CARDINAL; freq3 : ARRAY[0..35] OF CARDINAL; x, p, q : CARDINAL; y1, y2 : CARDINAL; f1, f2 : REAL; ch : CHAR; PROCEDURE Display1; BEGIN (* display p's *) GotoXY(freq1[p]-1, p+6); IF (freq1[p] MOD 10 # 0) THEN Highlight; Write('*'); Normal; ELSE Write('*'); END; WriteCard(p+1,1); (* display q's *) GotoXY(freq2[q]-1, q+14); IF (freq2[q] MOD 10 # 0) THEN Highlight; Write('#'); Normal; ELSE Write('#'); END; WriteCard(q+1,1); END Display1; PROCEDURE Display2(); VAR x : CARDINAL; BEGIN FOR x := 0 TO 14 DO GotoXY(18, 18-x); WriteCard(x,2); WriteString('-'); END; FOR x := 0 TO 35 DO GotoXY(22+x, 18-freq3[x]); Write('*'); END; END Display2; PROCEDURE RollDice() : CARDINAL; VAR rn : REAL; BEGIN rn := Random() * 6.0; RETURN TRUNC(rn); END RollDice; BEGIN ClearScreen; GotoXY(29,3); WriteString('Test of Dice Rolling'); AnyKeyMsg; GotoXY(0, 5); WriteString('First Die (p)'); GotoXY(0, 13); WriteString('Second Die (q)'); GotoXY(0, 21); WriteString('Count:'); (* clear variables *) FOR x := 0 TO 5 DO freq1[x] := 0; freq2[x] := 0; END; f1 := 0.0; f2 := 0.0; (* Main loop *) FOR x := 1 TO COUNT DO p := RollDice(); f1 := f1 + FLOAT(p); INC(freq1[p]); q := RollDice(); f2 := f2 + FLOAT(q); INC(freq2[q]); INC(freq3[p + q * 6]); Display1; GotoXY(7,21); WriteCard(x,3); END; GotoXY(20,5); WriteString('Bias: '); WriteReal(f1 / 5.0 / FLOAT(COUNT), 4,2); GotoXY(20,13); WriteString('Bias: '); WriteReal(f2 / 5.0 / FLOAT(COUNT), 4,2); AnyKeyMsg; ClearScreen; GotoXY(29, 3); WriteString('Incidence of p + q roll'); GotoXY(19,19); WriteString('p: '); FOR x := 1 TO 6 DO WriteString('123456'); END; GotoXY(19,20); WriteString('q: '); WriteString('111111222222333333444444555555666666'); GotoXY(10,22); WriteString('Total pairs rolled: '); WriteCard(COUNT,3); WriteString(' Nominal incidence: '); WriteReal(FLOAT(COUNT) / 36.0, 2,2); Display2; AnyKeyMsg; END DiceTest. ============== Edit here ====================================================== Part of my UTILITY module PROCEDURE AnyKeyMsg; (* Wait for user response, then seed random number generator *) VAR seed : CARDINAL; ch : CHAR; BEGIN GotoXY(10, 23); WriteString('Press any key to continue: '); seed := 1; BusyRead(ch); WHILE ch = 0C DO INC(seed); BusyRead(ch); END; Randomize(seed); GotoXY(0, 23); ClearToEOL; END AnyKeyMsg; ============================================================================== XY(0, 23); ClearToEOL; END AnyKe