packages feed

language-Modula2-0.1: examples/Modula-2_Libraries/PMOS/sources/tests/rantest.mod

MODULE RanTest;

	(********************************************************)
	(*							*)
	(*	    Test of random number generator		*)
	(*							*)
	(*  Programmer:		P. Moylan			*)
	(*  Last edited:	17 March 1995			*)
	(*  Status:		OK				*)
	(*							*)
	(********************************************************)

FROM Random IMPORT
    (* proc *)	RANDOM, Randomize;

FROM RandCard IMPORT
    (* var  *)	seed;

FROM Windows IMPORT
    (* type *)	Window,
    (* proc *)	OpenSimpleWindow, CloseWindow, WriteString, WriteLn,
		PressAnyKey;

FROM NumericIO IMPORT
    (* proc *)	WriteCard, WriteRJLongCard;

FROM RealIO IMPORT
    (* proc *)	WriteReal;

(************************************************************************)
(*				SPEED TEST				*)
(************************************************************************)

PROCEDURE SpeedTest (TestSize: CARDINAL);

    (* Generates a lot of random numbers.  Relies on the keyboard user	*)
    (* having a stopwatch, because the timing is not built into this	*)
    (* module.								*)

    VAR j: CARDINAL;  result: REAL;

    BEGIN
	FOR j := 1 TO TestSize DO
	    result := RANDOM();
	END (*FOR*);
    END SpeedTest;

(************************************************************************)
(*			    PLAUSIBILITY TESTS				*)
(************************************************************************)

PROCEDURE TenThousandTest (w: Window);

    (* Starting with seed = 1, after 10000 calls we should end up with	*)
    (* seed = 1043618065.						*)

    VAR j: CARDINAL;  dummy: REAL;

    BEGIN
	Randomize(1);
	FOR j := 1 TO 10000 DO dummy := RANDOM(); END (*FOR*);
	WriteString (w, "The current value of seed is ");
	WriteRJLongCard (w, seed, 11);
	WriteString (w, ".  It should be 1043618065");
	WriteLn (w);
    END TenThousandTest;

(************************************************************************)

PROCEDURE DisplayNumbers (w: Window);

    CONST TestSize = 100;

    VAR j: CARDINAL;  result: REAL;

    BEGIN
	WriteString (w, "Start of plausibility test");  WriteLn (w);
	FOR j := 1 TO TestSize DO
	    result := RANDOM();
	    WriteReal (w, result, 6);
	    IF j MOD 8 <> 0 THEN
		WriteString (w, "  ");
	    ELSE
		WriteLn (w);
	    END (*IF*);
	END (*FOR*);
	WriteLn (w);
	WriteString (w, "End of plausibility test");  WriteLn (w);
    END DisplayNumbers;

(************************************************************************)

PROCEDURE RunTheTests;

    CONST TestSize = 50000;

    VAR w: Window;

    BEGIN
	OpenSimpleWindow (w, 0, 24, 0, 79);
	DisplayNumbers (w);  TenThousandTest (w);
	WriteString (w, "Start of speed test");  WriteLn (w);
	PressAnyKey (w);
	SpeedTest (TestSize);
	WriteString (w, "End of speed test, ");
	WriteCard (w, TestSize);  WriteString (w, " numbers generated");
	WriteLn (w);
	PressAnyKey (w);  CloseWindow (w);
    END RunTheTests;

(************************************************************************)
(*				MAIN PROGRAM				*)
(************************************************************************)

BEGIN
    RunTheTests;
END RanTest.