### 5.6 Random Numbers ¶

A pseudo-random number generator is only as good as the tests it passes. George Marsaglia of Florida State University developed a battery of tests named DIEHARD (http://stat.fsu.edu/~geo/diehard.html). `diehard.c` has a bug which the patch http://groups.csail.mit.edu/mac/ftpdir/users/jaffer/diehard.c.pat corrects.

SLIB’s PRNG generates 8 bits at a time. With the degenerate seed ‘`0`’, the numbers generated pass DIEHARD; but when bits are combined from sequential bytes, tests fail. With the seed ‘`http://swissnet.ai.mit.edu/~jaffer/SLIB.html`’, all of those tests pass.

#### 5.6.1 Exact Random Numbers ¶

`(require 'random)`

Function: random n state ¶
Function: random n ¶

  n must be an exact positive integer. `random` returns an exact integer between zero (inclusive) and n (exclusive). The values returned by `random` are uniformly distributed from 0 to n.

  The optional argument state must be of the type returned by `(seed->random-state)` or `(make-random-state)`. It defaults to the value of the variable `*random-state*`. This object is used to maintain the state of the pseudo-random-number generator and is altered as a side effect of calls to `random`.

Variable: *random-state* ¶

  Holds a data structure that encodes the internal state of the random-number generator that `random` uses by default. The nature of this data structure is implementation-dependent. It may be printed out and successfully read back in, but may or may not function correctly as a random-number state object in another implementation.

Function: copy-random-state state ¶

  Returns a new copy of argument state.

Function: copy-random-state ¶

  Returns a new copy of `*random-state*`.

Function: seed->random-state seed ¶

  Returns a new object of type suitable for use as the value of the variable `*random-state*` or as a second argument to `random`. The number or string seed is used to initialize the state. If `seed->random-state` is called twice with arguments which are `equal?`, then the returned data structures will be `equal?`. Calling `seed->random-state` with unequal arguments will nearly always return unequal states.

Function: make-random-state ¶
Function: make-random-state obj ¶

  Returns a new object of type suitable for use as the value of the variable `*random-state*` or as a second argument to `random`. If the optional argument obj is given, it should be a printable Scheme object; the first 50 characters of its printed representation will be used as the seed. Otherwise the value of `*random-state*` is used as the seed.

#### 5.6.2 Inexact Random Numbers ¶

`(require 'random-inexact)`

Function: random:uniform ¶
Function: random:uniform state ¶

  Returns an uniformly distributed inexact real random number in the range between 0 and 1.

Function: random:exp ¶
Function: random:exp state ¶

  Returns an inexact real in an exponential distribution with mean 1. For an exponential distribution with mean u use `(* u (random:exp))`.

Function: random:normal ¶
Function: random:normal state ¶

  Returns an inexact real in a normal distribution with mean 0 and standard deviation 1. For a normal distribution with mean m and standard deviation d use `(+ m (* d (random:normal)))`.

Procedure: random:normal-vector! vect ¶
Procedure: random:normal-vector! vect state ¶

  Fills vect with inexact real random numbers which are independent and standard normally distributed (i.e., with mean 0 and variance 1).

Procedure: random:hollow-sphere! vect ¶
Procedure: random:hollow-sphere! vect state ¶

  Fills vect with inexact real random numbers the sum of whose squares is equal to 1.0. Thinking of vect as coordinates in space of dimension n = `(vector-length vect)`, the coordinates are uniformly distributed over the surface of the unit n-shere.

Procedure: random:solid-sphere! vect ¶
Procedure: random:solid-sphere! vect state ¶

  Fills vect with inexact real random numbers the sum of whose squares is less than 1.0. Thinking of vect as coordinates in space of dimension n = `(vector-length vect)`, the coordinates are uniformly distributed within the unit n-shere. The sum of the squares of the numbers is returned.