.TITLE IRANDV .SBTTL IRANDV -- UNIFORM RANDOM NUMBER S/R. ; EDIT # 0003 1 May 1981 22:43:52 DB1:[21,200]IRANDV.MAC;4 ; PREVIOUS EDIT 1 May 1981 22:19:26 DB1:[21,200]IRANDV.MAC;3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; ; SUBROUTINE IRANDV: GENERATES UNIFORMLY DISTRIBUTED RANDOM ; INTEGERS "U(N)" IN THE RANGE 1 <= U(N) <= 65535. BASED ; ON THE MULTIPLICATIVE CONGRUENCE SCHEME, ALSO CALLED THE ; POWER RESIDUE METHOD: ; ; U(N) = 259*U(N-1) (MOD 2**16) ; ; WHERE ; U(0) = 253 ; N = 1,2,3,...,16384 ; 259 = 8*T+3 .=. (2**16)**0.5; T = 32 ; ; FORTRAN CALLING SEQUENCE: ; ; CALL IRANDV(IRAND) ; ; WHERE ; ; IRAND = HIGH ORDER 15 BITS OF A 16 BIT UNSIGNED ; RANDOM INTEGER (LOW ORDER BIT ALWAYS = 1) ; ; NOTE: ON 1'ST CALL TO IRANDV, SHOULD HAVE ; IRAND = 126. (DECIMAL) ; ; TO OBTAIN A UNIFORM RANDOM NUMBER "URAND" IN THE ; RANGE (0.0,1.0): ; ; URAND = (2.0*FLOAT(IRAND)+1.0)/65536.0 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; IRANDV:: MOV R1,-(SP) ;SAVE SCRATCH REGISTER. MOV @2(R5),R1 ;GET HIGH WORD. SEC ;GET LOW BIT IN "C" (ALWAYS 1). ROL R1 ;MERGE HIGH AND LOW. MUL #259.,R1 ;MULTIPLY AND TRUNCATE HIGH WORD. ASR R1 ;VACATE THE SIGN BIT. BIC #^C077777,R1 ;ZERO THE SIGN BIT. MOV R1,@2(R5) ;STORE HIGH WORD. MOV (SP)+,R1 ;RESTORE SCRATCH REGISTER. RETURN .END