47 lines
		
	
	
	
		
			954 B
		
	
	
	
		
			Modula-2
		
	
	
	
	
	
			
		
		
	
	
			47 lines
		
	
	
	
		
			954 B
		
	
	
	
		
			Modula-2
		
	
	
	
	
	
(*
 | 
						|
  (c) copyright 1988 by the Vrije Universiteit, Amsterdam, The Netherlands.
 | 
						|
  See the copyright notice in the ACK home directory, in the file "Copyright".
 | 
						|
*)
 | 
						|
 | 
						|
(*$R-*)
 | 
						|
IMPLEMENTATION MODULE random;
 | 
						|
(*
 | 
						|
  Module:       random numbers
 | 
						|
  Author:       Ceriel J.H. Jacobs
 | 
						|
  Version:      $Header$
 | 
						|
*)
 | 
						|
 | 
						|
FROM Unix IMPORT getpid, time;
 | 
						|
TYPE index = [0..54];
 | 
						|
 | 
						|
VAR	X: ARRAY index OF CARDINAL;
 | 
						|
	k, j: index;
 | 
						|
 | 
						|
PROCEDURE Random(): CARDINAL;
 | 
						|
BEGIN
 | 
						|
	IF k+1 > 54 THEN k := 0; ELSE INC(k) END;
 | 
						|
	IF j+1 > 54 THEN j := 0; ELSE INC(j) END;
 | 
						|
	X[k] := X[k] + X[j];
 | 
						|
	RETURN X[k]
 | 
						|
END Random;
 | 
						|
 | 
						|
PROCEDURE Uniform (lwb, upb: CARDINAL): CARDINAL;
 | 
						|
BEGIN
 | 
						|
    	IF upb <= lwb THEN RETURN lwb; END;
 | 
						|
    	RETURN lwb + (Random() MOD (upb - lwb + 1));
 | 
						|
END Uniform;
 | 
						|
 | 
						|
PROCEDURE StartSeed(seed: CARDINAL);
 | 
						|
BEGIN
 | 
						|
	X[0] := seed;
 | 
						|
	FOR k := 1 TO 54 DO
 | 
						|
		X[k] := X[k-1] * 1297;
 | 
						|
	END;
 | 
						|
	k := 54;
 | 
						|
	j := 30;
 | 
						|
END StartSeed;
 | 
						|
 | 
						|
BEGIN
 | 
						|
 	X[0] := time(NIL);
 | 
						|
	StartSeed(CARDINAL(getpid()) * X[0]);
 | 
						|
END random.
 |