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. EXTERNAL JOBAPR ENTRY RAND,IRAND RAND: Z SETOM FPFLAG# ;SET FLOATING POINT SWITCH JRST IRAND1 IRAND: Z SETZM FPFLAG ;SET INTEGER SWITCH IRAND1: JSR IRAND2 ;JSR IN ORDER TO PRESERVE FLAGS JRA 16,1(16) ;RETURN IRAND2: Z MOVE 0,@(16) ;GET ARG SKIPN 0 ;ARG=0? MOVEI 0,1 ;YES - RESTART MOVE 1,JOBAPR ;FOUL FLAG-TRAPPING MOVEM 1,FLAGS# MOVEI 1,IRAND3 MOVEM 1,JOBAPR IMUL 0,CON ;GENERATE NEXT NUMBER IRAND3: MOVE 1,FLAGS MOVEM 1,JOBAPR 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