Theory of Operation
The ziggurat algorithm is a rejection sampling algorithm; it randomly generates a point in a distribution slightly larger than the desired distribution, then tests whether the generated point is inside the desired distribution. If not, it tries again. Given a random point underneath a probability distribution curve, its x coordinate is a random number with the desired distribution.
The distribution the ziggurat algorithm chooses from is made up of n equal-area regions; n − 1 rectangles that cover the bulk of the desired distribution, on top of a non-rectangular base that includes the tail of the distribution.
Given a monotone decreasing probability distribution function f(x), defined for all x≥0, the base of the ziggurat is defined as all points inside the distribution and below y1 = f(x1). This consists of a rectangular region from (0, 0) to (x1, y1), and the (typically infinite) tail of the distribution, where x > x1 (and y < y1).
This layer (call it layer 0) has area A. On top of this, add a rectangular layer of width x1 and height A/x1, so it also has area A. The top of this layer is at height y2 = y1 + A/x1, and intersects the distribution function at a point (x2, y2), where y2 = f(x2). This layer includes every point in the distribution function between y1 and y2, but (unlike the base layer) also includes points such as (x1, y2) which are not in the desired distribution.
Further layers are then stacked on top. To use a precomputed table of size n (n = 256 is typical), one chooses x1 such that xn=0, meaning that the top box, layer n−1, reaches the distribution's peak at (0, f(0)) exactly.
Layer i extends vertically from yi to yi+1, and can be divided into two regions horizontally: the (generally larger) portion from 0 to xi+1 which is entirely contained within the desired distribution, and the (small) portion from xi+1 to xi, which is only partially contained.
Ignoring for a moment the problem of layer 0, and given uniform random variables U0 and U1 ∈ [0,1), the ziggurat algorithm can be described as:
- Choose a random layer 0 ≤ i < n.
- Let x = U0xi.
- If x < xi+1, return x.
- Let y = yi + U1(yi+1−yi).
- Compute f(x). If y < f(x), return x.
- Otherwise, choose new random numbers and go back to step 1.
Step 1 amounts to choosing a low-resolution y coordinate. Step 3 tests if the x coordinate is clearly within the desired distribution function without knowing more about the y coordinate. If it is not, step 4 chooses a high-resolution y coordinate and step 5 does the rejection test.
With closely spaced layers, the algorithm terminates at step 3 a very large fraction of the time. Note that for the top layer n−1, however, this test always fails, because xn = 0.
Layer 0 can also be divided into a central region and an edge, but the edge is an infinite tail. To use the same algorithm to check if the point is in the central region, generate a fictitious x0 = A/y1. This will generate points with x < x1 with the correct frequency, and in the rare case that layer 0 is selected and x ≥ x1, use a special fallback algorithm to select a point at random from the tail. Because the fallback algorithm is used less than one time in a thousand, speed is not essential.
Thus, the full ziggurat algorithm for one-sided distributions is:
- Choose a random layer 0 ≤ i < n.
- Let x = U0xi
- If x < xi+1, return x.
- If i=0, generate a point from the tail using the fallback algorithm.
- Let y = yi + U1(yi+1−yi).
- Compute f(x). If y < f(x), return x.
- Otherwise, choose new random numbers and go back to step 1.
For a two-sided distribution, of course, the result must be negated 50% of the time. This can often be done conveniently by choosing U0 ∈ (−1,1) and, in step 3, testing if |x| < xi+1.
Read more about this topic: Ziggurat Algorithm
Famous quotes containing the words theory of, theory and/or operation:
“Many people have an oversimplified picture of bonding that could be called the epoxy theory of relationships...if you dont get properly glued to your babies at exactly the right time, which only occurs very soon after birth, then you will have missed your chance.”
—Pamela Patrick Novotny (20th century)
“Hygiene is the corruption of medicine by morality. It is impossible to find a hygienest who does not debase his theory of the healthful with a theory of the virtuous.... The true aim of medicine is not to make men virtuous; it is to safeguard and rescue them from the consequences of their vices.”
—H.L. (Henry Lewis)
“You may read any quantity of books, and you may almost as ignorant as you were at starting, if you dont have, at the back of your minds, the change for words in definite images which can only be acquired through the operation of your observing faculties on the phenomena of nature.”
—Thomas Henry Huxley (182595)