## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

No credit card required

# Generating Biased Random Numbers

## Problem

You want to pick a random value where the probabilities of the values are not equal (the distribution is not even). You might be trying to randomly select a banner to display on a web page, given a set of relative weights saying how often each banner is to be displayed. Alternatively, you might want to simulate behavior according to a normal distribution (the bell curve).

## Solution

If you want a random value distributed according to a specific function—e.g., the Gaussian (Normal) distribution—consult a statistics textbook to find the appropriate function or algorithm. This subroutine generates random numbers that are normally distributed, with a standard deviation of 1 and a mean of 0.

```sub gaussian_rand {
my (\$u1, \$u2);  # uniformly distributed random numbers
my \$w;          # variance, then a weight
my (\$g1, \$g2);  # gaussian-distributed numbers

do {
\$u1 = 2 * rand() - 1;
\$u2 = 2 * rand() - 1;
\$w = \$u1*\$u1 + \$u2*\$u2;
while (\$w >= 1 || \$w == 0)

\$w = sqrt( (-2 * log(\$w))  / \$w );
\$g2 = \$u1 * \$w;
\$g1 = \$u2 * \$w;
# return both if wanted, else just one
return wantarray ? (\$g1, \$g2) : \$g1;
}```

If you have a list of weights and values you want to randomly pick from, follow this two-step process: First, turn the weights into a probability distribution with `weight_to_dist` below, and then use the distribution to randomly pick a value with `weighted_rand`:

`# weight_to_dist: takes a hash mapping key to weight and returns # a hash mapping key to probability sub weight_to_dist ...`

## With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

No credit card required