; ; Random number generator. ; Original author: unknown. This code was pulled off one of the nets and ; added to the library. Any information on the original ; author would be appreciated. ; ; Modified for use with UCR Standard library 10/24/91 rhyde ; ; StdGrp group StdLib, StdData StdData segment para public 'sldata' ; ; Note: 24 and 55 are not arbitrary. They have been chosen so that the least ; significant bits in the sequence of pseudorandom integers have a period of ; length 2^55 - 1. The sequence of pseudorandom numbers themselves have period ; 2^f*(2^55 - 1) where 0 <= f <= 16. See Knuth's Volume 2 "Seminumerical ; Algorithms" of the second edition of the three volume set THE ART OF COMPUTER ; PROGRAMMING (pages 26 & 27). j dw 24 * 2 ; multiply by 2 for word offsets k dw 55 * 2 ; Array of 55 seed elements for the additive pseudorandom number generator. add_array dw ? ; this location (offset 0 word) is not used dw 7952, 42720, 56941, 47825, 52353, 4829, 32133 dw 29787, 7028, 62292, 46128, 34856, 63646, 21032 dw 62660, 61244, 35057, 36989, 43989, 46043, 48547 dw 43704, 29749, 21898, 10279, 48252, 35578, 27916 dw 3633, 50349, 33655, 36965, 48566, 43375, 15168 dw 30425, 8425, 31783, 3625, 23789, 37438, 64887 dw 19015, 43108, 61545, 24901, 58349, 52290, 62047 dw 21173, 27055, 27851, 47955, 14377, 14434 StdData ends stdlib segment para public 'slcode' assume cs:StdGrp, ds:StdGrp ; ; public sl_randomize ; sl_randomize proc far ; randomize the random number generator push ds push ax ; save push bx push cx ; mov ax,40h ; set ds to BIOS data area mov ds,ax mov bx,6ch ; location of low word of 4-byte count mov ax,[bx] ; get low word of 4-byte clock count mov bx, StdGrp ; reset ds for code addressing mov ds, bx mov bx,offset add_array ; address array of seed elements add bx,2 ; offset 0 is not used mov cx,55 ; shall adjust all 55 seeds set_seed: add [bx],ax ; randomize seed value with current time add bx,2 ; move to next one loop set_seed ; pop cx pop bx pop ax pop ds ret sl_randomize endp ; ; ; ; sl_Random- Returns random number in AX (random bit values). ; public sl_Random ; sl_random proc far ; generate pseudorandom number in ax push bx ; save push cx push ds ; mov bx, StdGrp mov ds, bx ; mov bx,j ; get j index mov cx,add_array[bx]; and load array element into cx mov bx,k ; get k index mov ax,add_array[bx]; and load array element into ax add ax,cx ; new element and return value to ax mov add_array[bx],ax; store new element at location k sub j,2 ; move down one element sub k,2 ; move down one element cmp j,0 ; is j down to 0? jne check_k ; no, check k mov j,55 * 2 ; set i to end of array check_k: cmp k,0 ; is k down to 0? jne random_out ; no, leave mov k,55 * 2 ; set k to end of array ; random_out: pop ds pop cx ; restore pop bx ret sl_random endp ; StdLib ends end