--FILE: RandomCodeRandomImpl.mesa --Last Edited by: Sturgis, October 9, 1984 11:15:17 am PDT DIRECTORY RandomCodeRandom USING[]; RandomCodeRandomImpl: CEDAR PROGRAM EXPORTS RandomCodeRandom = BEGIN -- random number stuff (February 13, 1978) (by jim morris and Jim Mitchell) -- modified to be in a record August 26, 1982 5:36 pm: Sturgis Degree: CARDINAL = 33; MidPower: CARDINAL = 13; RandomState: TYPE = REF RandomStateBody; RandomStateBody: PUBLIC TYPE = RECORD[ table: ARRAY[0..Degree) OF CARDINAL, index: CARDINAL, trailer: CARDINAL]; MorrisRandomTable: ARRAY [0..Degree) OF CARDINAL _ [56572B, 112312B, 4714B, 100763B, 62510B, 1572B, 12255B, 132113B, 166574B, 2440B, 104704B, 105254B, 106030B, 7053B, 56322B, 41163B, 11105B, 136203B, 55327B, 125100B, 76206B, 167173B, 173672B, 33211B, 134253B, 153317B, 25327B, 136567B, 171517B, 23161B, 44276B, 72324B, 143455B]; -- these initial values were obtained by calling InitRandom[123]. MorrisRandomIndex: CARDINAL _ 0; MorrisRandomTrailer: CARDINAL _ Degree-MidPower; InitRandom: PUBLIC PROCEDURE[seed: CARDINAL] RETURNS[state: RandomState] = BEGIN i: CARDINAL; xseed: CARDINAL; state _ NEW[RandomStateBody]; FOR i IN [0..Degree) DO state.table[i] _ 0 ENDLOOP; state.table[0] _ 2*seed+1; xseed _ seed; FOR i IN [1..MIN[16, Degree-1]] DO state.table[i] _ IF LOOPHOLE[xseed, INTEGER] < 0 THEN 1 ELSE 0; xseed _ 2*xseed; ENDLOOP; state.index _ 0; state.trailer _ Degree-MidPower; THROUGH [1..2000] DO [] _ Random[state] ENDLOOP; RETURN; END; Random: PUBLIC PROCEDURE [state: RandomState] RETURNS [CARDINAL] = BEGIN Result: CARDINAL = state.table[state.index]+state.table[state.trailer]; state.table[state.index] _ Result; SELECT state.index+1 FROM < Degree => BEGIN state.index _ state.index+1; state.trailer _ IF state.trailer < Degree-1 THEN state.trailer+1 ELSE 0; END; = Degree => BEGIN state.index _ 0; state.trailer _ Degree - MidPower; END; ENDCASE => ERROR; -- should never be greater than Degree RETURN [Result]; END; END. MODULE HISTORY Initial by: Sturgis, October 9, 1984 11:16:06 am PDT: edited from RandomCodeTestImpl ÊU˜JšœÏb œˆœÏ˜öJ˜JšÏkœ˜Jšžœž˜J˜JšœV˜VJ˜J˜—…—è C