home *** CD-ROM | disk | FTP | other *** search
- 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