.TITLE RANDOM -- GENERATE RANDOM NUMBERS .IDENT -000100- ;+ ; ABSTRACT: RANDOM ; ; THIS SUBROUTINE IMPLEMENTS A RANDOM NUMBER GENERATOR ; USING A SHIFT REGISTER ALGORITHM. THE ALGORITHM HAS ; BETTER STATISTICAL PROPERTIES THAN THE POPULAR RANDU ; FUNCTION. ; ; CALLING SEQUENCE: ; ; CALL RANDOM (I, M, N) ; ; ARGUMENTS: ; ; DOUBLE PRECISION [REAL*8] I ; THE RANDOM NUMBER. ON INPUT, THIS IS THE LAST RANDOM ; NUMBER, AND ON OUTPUT IT IS THE NEXT RANDOM NUMBER. ; IT MUST LIE IN THE RANGE 1 <= I <= 2**31. ; ; INTEGER M ; THE SHIFT AMOUNT. THIS NUMBER IS SENSITIVE TO THE ; WORD SIZE (SEE N), AND EACH SHIFT AMOUNT WILL PRODUCE ; A DIFFERENT SEQUENCE FOR A SPECIFIC WORD SIZE. FOR ; EXAMPLE, IF THE WORD SIZE IS 31 (THE NORMAL CASE, AND ; THE MAXIMUM NUMBER ALLOWED), VALUES OF 3, 6, 7, AND ; 13 FOR M ALL OFFER GOOD DISTRIBUTIONS OF THE RANDOM ; VARIABLE. ; ; INTEGER N ; THE WORD SIZE. THIS IS THE NUMBER OF BITS IN THE WORD ; (THE SIGN BIT MAY NOT BE INCLUDED). THE MAXIMUM VALUE, ; AND THE ONLY RECOMMENDED VALUE, IS 31. ; ; WRITTEN: 13-NOV-78, -0.0.0-, BRUCE C. WRIGHT ; MODIFIED: 2-FEB-79, -0.1.0-, BRUCE C. WRIGHT ; CHANGED TO BE RE-ENTRANT. ; VERIFIED: 2-FEB-79, -0.1.0-, BRUCE C. WRIGHT ;- AC0 = %0 I = 2 M = 4 N = 6 RANDOM:: STFPS -(SP) ;SAVE FLOAT STATUS. MOV R0,-(SP) ;SAVE R0 MOV R1,-(SP) ;AND R1 MOV R2,-(SP) ;AND R2 SETD SETL LDD @I(R5),AC0 ;GET RANDOM NUMBER. STCDL AC0,-(SP) ;STORE 31-BIT # IN TEMP AREA. MOV (SP),R0 ;PICK UP 31-BIT # MOV 2(SP),R1 MOV @M(R5),R2 ;GET SHIFT. NEG R2 ;MAKE IT A RIGHT SHIFT. ASHC R2,R0 ;SHIFT R0,R1 RIGHT 'M' BITS XOR R0,(SP) ;EXCLUSIVE-OR BACK WITH ORIGINAL. XOR R1,2(SP) ADD @N(R5),R2 ;COMPUTE N-M FOR SHIFT. MOV (SP),R0 ;RECOVER XOR'D NUMBER. MOV 2(SP),R1 ASHC R2,R0 ;SHIFT LEFT N-M BITS. XOR R0,(SP) ;EXCLUSIVE-OR BACK AGAIN. XOR R1,2(SP) ; BIC #100000,(SP) ;CLEAR SIGN BIT. LDCLD (SP)+,AC0 ;GET BACK INTO REAL*8 NUMBER. STD AC0,@I(R5) ;AND SAVE IT. MOV (SP)+,R2 ;RESTORE R2 MOV (SP)+,R1 MOV (SP)+,R0 ;AND R0 LDFPS (SP)+ ;RESTORE FLOAT STATUS. RETURN ;AND RETURN TO CALLER. .END