# Random Numbers in Franz

• To: franz-friends@berkeley
• Subject: Random Numbers in Franz
• From: jkf@UCBKIM (John Foderaro)
• Date: Tue, 1 Dec 82 17:13:03 GMT
• Original-date: 1-Dec-82 09:13:03-PST (Wed)

```Original-Date: 29-Nov-82 15:56:09-PST (Mon)
Date: Sun, 29 Nov 82 23:56:09 GMT
From: alice!sola!mitch
Subject: Random Numbers in Franz
To: alice!ucbvax!franz-friends@Berkeley

In general, it is very bad practice to compute a random number between 0
and n by any expression such as (mod (random) n).  In fact, Franz's
random function does exactly that, returning the number generated by the
C function rand(3) modulo n.  This technique uses only the rightmost
bits of successive calls to rand, and the righmost n bits of congruential
sequences (like that returned by rand(3)) have a period of AT MOST 2**n
(See Knuth vol.2 p. 12).  So using the rightmost two bits will indeed give
you sequences of at most period 4.  (If your lisp doesn't have this
behavior, you're not using the standard rand.)

A better way to do it is to use the high order bits, by dividing the entire
range up into n pieces and then seeing where you fall.  (This method is
biased if n is of the same order as the range, though.)

The code I use is:

(or (getd '\$old-random) (putd '\$old-random (getd 'random)))

(defun random n
(cond ((eq n 0) (\$old-random))
((fix (quotient (boole 1 (\$old-random) #o 7777777777)
(quotient #o 7777777777 (arg 1)))))))

Mitch Marcus

```