TITLE RAND RANDOM NUMBER GENERATOR SUBTTL B.E -21.OCTOBER 1970 ;DRAND.F4 IS A SAMPLE PROGRAM, WHEN USED IN CONJUNCTION ;WITH RAND.MAC(LOADED AND SAVED AS DRAND.SAV) WILL ;ILLUSTRATE THE USE OF RAND.MAC ;MULTIPLICATIVE CONGRUENTIAL RANDOM NUMBER GENERATOR TO ;BE CALLED AS A FUNCTION FROM A FORTRAN PROGRAM. THERE ;ARE TWO ENTRY POINTS: ; 1) IRAND RETURNS A RANDOM INTEGER BETWEEN ; 0 AND 2**35 - 1. ; 2) RAND RETURNS A RANDOM FLOATING POINT NUM- ; BER BETWEEN 0.0 AND 1.0. ;BOTH CALLS REQUIRE A SINGLE INTEGER ARGUMENT WHICH ;IS USED TO GENERATE A RANDOM INTEGER BY MEANS OF THE ;FORMULA: ; R = (5**13)*ARG (MOD 2**35) ;THE RANDOM INTEGER THUS GENERATED IS STORED OVER ;THE ARGUMENT TO BECOME THE ARGUMENT FOR THE NEXT CALL, ;HENCE THE ARGUMENT MUST APPEAR IN THE CALLING SEQUENCE ;AS A VARIABLE RATHER THAN A CONSTANT. IF THE CALL ;WAS TO RAND, THE NEW RANDOM INTEGER IS CONVERTED TO A ;FLOATING POINT NUMBER BETWEEN 0.0 AND 1.0 BEFORE ;RETURNING. VIDE GORENSTEIN, "TESTING A RANDOM NUMBER ;GENERATOR", COMM ACM, FEB 67. ; Modified to PUSHJ/POPJ calling convention 11 Oct 1980 ; by Paul T. Robinson, Wesleyan Univ. for DECUS conversion to DEC-20 ; EXTERNAL JOBAPR external .jbapr ENTRY RAND,IRAND P=17 RAND: SETOM FPFLAG# ;SET FLOATING POINT SWITCH JRST IRAND1 IRAND: SETZM FPFLAG ;SET INTEGER SWITCH IRAND1: JSR IRAND2 ;JSR IN ORDER TO PRESERVE FLAGS popj p, ;return IRAND2: Z MOVE 0,@(16) ;GET ARG SKIPN 0 ;ARG=0? MOVEI 0,1 ;YES - RESTART MOVE 1,.jbapr ;FOUL FLAG-TRAPPING MOVEM 1,FLAGS# MOVEI 1,IRAND3 MOVEM 1,.jbapr IMUL 0,CON ;GEERATE NEXT NUMBER IRAND3: MOVE 1,FLAGS MOVEM 1,.jbapr TLZ 0,400000 ;MAKE SURE IT'S POSITIVE MOVEM 0,@(16) ;PUT IT AWAY FOR NEXT CALL SKIPN FPFLAG ;INTEGER ANSWER REQUIRED? JRST 2,@IRAND2 ;YES - RETURN WITH IT LSH 0,-10 ;NO - CONVERT TO FLOATING POINT FSC 0,200 ;AND DIVIDE BY 2**35 JRST 2,@IRAND2 ;RESTORE FLAGS & RETURN CON: 5*5*5*5*5*5*5*5*5*5*5*5*5 END