65300 #include "rundecs.h" 65310 (* COPYRIGHT 1983 C.H.LINDSEY, UNIVERSITY OF MANCHESTER *) 65320 (**) 65330 PROCEDURE ERRORR(N: INTEGER);EXTERN; 65340 PROCEDURE GARBAGE(ANOBJECT: OBJECTP);EXTERN; 65350 FUNCTION SAFEACCESS(LOCATION: OBJECTP): UNDRESSP; EXTERN; 65360 (**) 65370 (**) 65380 FUNCTION RAND(VAR SEED: INTEGER): REAL; 65390 CONST 65400 (*+11() 65410 MULTIPLIER=16777215; 65420 PRIMEMODULUS=281474976710597; 65430 (*N=48, L=24, M=24*) 65440 TWOL=16777216; 65450 TWOM=16777216; 65460 PRIMEDIFF=59; (*2^N - PRIMEMODULUS*) 65470 SHRINKER=4614343880501.61; 65480 STRETCHER=4614343880502.55; 65490 ()+11*) 65500 (*+12() 65510 MULTIPLIER=176; 65520 PRIMEMODULUS=32749; 65530 (*N=15, L=7, M=8*) 65540 TWOL=128; 65550 TWOM=256; 65560 PRIMEDIFF=19; (*2^N - PRIMEMODULUS*) 65570 SHRINKER=1560.381; 65580 STRETCHER=1559.381; 65590 ()+12*) 65600 (*+13() 65610 MULTIPLIER=46340; 65620 PRIMEMODULUS=2147483647; 65630 (*N=31, L=15, M=16*) 65640 TWOL=32768; 65650 TWOM=65536; 65660 PRIMEDIFF=1; (*2^N - PRIMEMODULUS*) 65670 SHRINKER=715827882.334; 65680 STRETCHER=715827881.667; 65690 ()+13*) 65700 VAR HIBITS,MIDBITS,LOBITS: INTEGER; 65710 LSHALFOFRAND: REAL; 65720 BEGIN 65730 SEED := SEED+(1-TRUNC(SEED/SHRINKER)); 65740 LSHALFOFRAND := SEED/PRIMEMODULUS; 65750 LSHALFOFRAND := LSHALFOFRAND/PRIMEMODULUS; 65760 LOBITS := SEED MOD TWOL * MULTIPLIER; 65770 MIDBITS := (SEED DIV TWOL - TWOL)*MULTIPLIER + LOBITS DIV TWOL; 65780 IF MIDBITS>=0 THEN 65790 BEGIN 65800 HIBITS := MIDBITS DIV TWOM; 65810 MIDBITS := MIDBITS MOD TWOM + MULTIPLIER*TWOL; 65820 END 65830 ELSE 65840 BEGIN 65850 HIBITS := (MIDBITS+1) DIV TWOM -1; 65860 MIDBITS := MIDBITS MOD TWOM; 65870 MIDBITS := MIDBITS + ORD(MIDBITS<0)*TWOM + MULTIPLIER*TWOL; 65880 (*IN CASE PASCAL COMPILER DOES NOT IMPLEMENT MOD CORRECTLY*) 65890 END; 65900 HIBITS := HIBITS + MIDBITS DIV TWOM; 65910 MIDBITS := MIDBITS MOD TWOM; 65920 LOBITS := LOBITS MOD TWOL + MIDBITS*TWOL; 65930 SEED := LOBITS - PRIMEMODULUS + HIBITS*PRIMEDIFF; 65940 IF SEED<0 THEN SEED := SEED + PRIMEMODULUS; 65950 RAND := SEED/PRIMEMODULUS+LSHALFOFRAND; 65960 SEED := SEED+TRUNC((SEED-1)/STRETCHER)-1 65970 END; 65980 (**) 65990 (**) 66000 FUNCTION RANDOM: REAL; 66010 BEGIN 66020 RANDOM := RAND(LASTRANDOM) 66030 END; 66040 (**) 66050 (**) 66060 FUNCTION NEXTRAN(SEEDP: OBJECTP): REAL; 66070 VAR PTR: UNDRESSP; 66080 BEGIN 66090 PTR := SAFEACCESS(SEEDP); 66100 NEXTRAN := RAND(PTR^.FIRSTWORD); 66110 IF FPTST(SEEDP^) THEN GARBAGE(SEEDP); 66120 END; 66130 (**) 66140 (**) 66150 (*-02() 66160 BEGIN (* OF A68 *) 66170 END (* OF A68 *); 66180 ()-02*) 66190 (*+01() 66200 BEGIN (* OF MAIN PROGRAM *) 66210 END (* OF MAIN PROGRAM *). 66220 ()+01*)