Path: utzoo!censor!geac!torsqnt!news-server.csri.toronto.edu!cs.utexas.edu!swrinde!zaphod.mps.ohio-state.edu!maverick.ksu.ksu.edu!unmvax!ariel.unm.edu!nmsu!opus!eiverson From: eiverson@nmsu.edu (Eric Iverson) Newsgroups: comp.lang.modula2 Subject: Re: RND Function Needed Message-ID: Date: 27 Nov 90 08:01:59 GMT References: <1484.2750D9EC@puddle.fidonet.org> Sender: news@NMSU.Edu Organization: Computing Research Lab Lines: 92 In-reply-to: Jon.Guthrie@p15.f20.n226.z1.fidonet.org's message of 24 Nov 90 17:37:39 GMT Just in case anyone cares, this is the random number generator Ted Dunning hacked out today: IMPLEMENTATION MODULE Rand; (* 7^5 is a reasonable linear congruential generator for 32 bit arithmetic, longs should be at least that long, see cacm october or november 1988 *) FROM Clock IMPORT (* Type *) SystemTime, (* Procedure *) GetSystemTime; FROM MathLib IMPORT Entier; TYPE LONGSEED = ARRAY[0..55] OF LONGINT; VAR Seed : LONGSEED; Next : INTEGER; PROCEDURE SetSeed ( ); VAR I : INTEGER; N : LONGINT; S : SystemTime; BEGIN (* SetSeed *) GetSystemTime(S); N := S.seconds + S.microSeconds; FOR I := 0 TO 55 DO Seed[I] := N; N := 7*N; N := 7*N; N := 7*N; N := 7*N; N := 7*N; IF ( N < 0 ) THEN N := -N; END (* IF *); IF ( N < 0 ) THEN N := 0; END; END (* FOR *); Next := 0; END SetSeed; PROCEDURE Random ( ):REAL; VAR K: INTEGER; BEGIN K := Next-24; IF ( K < 0 ) THEN K := K+56; END (* IF *); Seed[Next] := Seed[Next] + Seed[K]; K := Next-55; IF ( K < 0 ) THEN K := K+56; END (* IF *); Seed[Next] := Seed[Next] + Seed[K]; K := Next; Next := Next+1; IF ( Next >= 56 ) THEN Next := 0; END (* IF *); IF ( Seed[K] < 0 ) THEN Seed[K] := -Seed[K]; END (* IF *); IF ( Seed[K] < 0 ) THEN Seed[K] := 0; END; RETURN FLOAT(Seed[K])/2147483647.0; END Random; BEGIN (* Rand *) SetSeed; END Rand. -- ------------------------------------------------------------------------ Eric Iverson Internet: eiverson@nmsu.edu Computing Research Lab Box 30001/3CRL Life is something to do when New Mexico State University you can't get to sleep. Las Cruces, NM 88003-0001 -Fran Lebowitz VOICE: (505) 646-5711 FAX: (505) 646-6218