+Lee Stewart Posted January 17, 2018 Share Posted January 17, 2018 Because this topic has surfaced in several threads on this forum, I decided to give it its own thread and explain in great detail how TI Basic’s RND function and the GPL RAND function it calls 7 – 69 times work. GPL RAND function— RAND takes a one-byte argument (lim) that represents the limit of the pseudorandom number (PRN) that is to be returned to the caller in >8378. RAND first generates a 16-bit PRN from the seed value (16 bits) in >83C0 as follows: PRN = SEED * 28645 + 31417 RAND then stores the PRN thus generated back into >83C0 as the new seed. RAND next adds 1 to the limit value it was passed to use as the modulus to operate on the PRN just generated after its bytes are swapped (now PRN'). The number returned in >8378 = PRN' modulo (lim+1). Here is the code for GPL RAND (coded in TMS9900 Assembler in Console ROM 0: *-------- GENERATE A PSEUDORANDOM NUMBER ---------- * WKSC EQU >83C0 ISR workspace (R0 = PRN SEED) WKSE EQU >83E0 GPL workspace R5LSB EQU WKSE+R5+R5+1 low byte of R5 of GPL WS RANDOM EQU >8378 return location for RAND's PRN return byte RAND LI R4,>6FE5 28645 to R4 MPY @WKSC,R4 SEED * 28645 AI R5,>7AB9 PRN = SEED * 28645 + 31417 MOV R5,@WKSC PRN is stored as new SEED in >83C0 MOVB *R13,R6 load limit number (byte) from caller to R6 SRL R6,8 shift to LSB INC R6 make modulus (lim+1) CLR R4 clear upper half of dividend SWPB R5 swap bytes of PRN to get PRN' DIV R6,R4 perform division by modulus (lim+1) MOVB @R5LSB,@RANDOM store LSB of remainder in >8378 B @NEXT return to caller for next GPL instruction TI Basic RND function— RND takes no arguments and generates a pseudorandom number (PRN) as an 8-byte, radix-100, floating point number (0 <= PRN < 1) and stores it at FAC (>834A). RND calls GPL RAND at least 7 times, once for each radix-100 digit in the significand (7 significant radix-100 digits in mantissa) and as much as 69 times, which is extremely unlikely. RND calls RAND with a limit of 99, which is the highest value possible for a radix-100 digit. The first PRN digit of the significand is in a loop that insures it will not be 0 unless 63 zeros in a row are returned (extremely unlikely), in which case a floating point 0 is returned as the resulting PRN. For each time through the first-digit loop that returns 0, the excess-64 exponent that started at >3F (-1 actual exponent) is decremented by 1 and another PRN is generated. This continues until either a non-zero digit is returned or the excess-64 exponent gets to 0 (-64 actual), in which case RND exits with a floating point 0 in FAC. If a non-zero digit is returned, that becomes the first radix-100 digit of the significand. RND then continues to get the remaining 6 radix-100 digits of the floating point number before returning to the caller. Here is the code for TI Basic RND (coded in GPL in Console GROM 2) [Note that, where there are 2 operands, the order is destination,source.]: RND ST @>834A,>3F radix-100 exponent = -1 to FAC ST @>8310,>4B loop counter for significand starting at FAC+1 RND1 RAND >63 get random radix-100 digit to >8378 CZ @>8378 0? BR GROM@RND3 no, keep current exponent and go on DEC @>834A decrement exponent in FAC CZ @>834A 0? BS GROM@RND4 exit with 0 as random number BR GROM@RND1 back to exponent manipulation RND2 RAND >63 get random radix-100 digit to >8378 RND3 ST *>8310,@>8378 all 7 radix-100 digits (FAC+1 to FAC+7) CEQ @>8310,>51 till >8351 (FAC+ BS GROM@RNDX exit if beyond end of number INC @>8310 increase loop counter BR GROM@RND2 back to get next random digit RND4 CLR @>834B set 0 RNDX CONT return to TI Basic ...lee 5 Quote Link to comment Share on other sites More sharing options...

+Vorticon Posted January 17, 2018 Share Posted January 17, 2018 Great explanation Lee! I saved this for future reference. Thanks! Quote Link to comment Share on other sites More sharing options...

## Recommended Posts

## Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Note:Your post will require moderator approval before it will be visible.