Trailing-Edge
-
PDP-10 Archives
-
decuslib20-01
-
decus/20-0013/rand.mac
There are 5 other files named rand.mac in the archive. Click here to see a list.
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