home | O'Reilly's CD bookshelfs | FreeBSD | Linux | Cisco | Cisco Exam

# ## 2.7. Generating Random Numbers

### Problem

You want to make random numbers in a given range, inclusive, such as when you randomly pick an array index, simulate rolling a die in a game of chance, or generate a random password.

### Solution

Use Perl's ``` rand``` function.

`\$random = int( rand( \$Y-\$X+1 ) ) + \$X;`

### Discussion

This code generates and prints a random integer between 25 and 75, inclusive:

```\$random = int( rand(51)) + 25;
print "\$random\n";```

The ``` rand``` function returns a fractional number, from (and including) 0 up to (but not including) its argument. We give it an argument of 51 to get a number that can be 0 or more, but never 51 or more. We take the integer portion of this to get a number from 0 to 50, inclusive (50.99999.... will be turned to 50 by ``` int``` ). We then add 25 to it, to get a number from 25 to 75, inclusive.

A common application of this is the random selection of an element from an array:

`\$elt = \$array[ rand @array ];`

And generating a random password from a sequence of characters:

```@chars = ( "A" .. "Z", "a" .. "z", 0 .. 9, qw(! @ \$ % ^ & *) );
\$password = join("", @chars[ map { rand @chars } ( 1 .. 8 ) ]);```

We use ``` map``` to generate eight random indices into ``` @chars``` , extract the corresponding characters with a slice, and join them together to form the random password. This isn't a good random number, though, as its security relies on the choice of seed, which is based on the time the program started. See Recipe 2.8 for a way to better seed your random number generator.

The ``` int``` , ``` rand``` , ``` map``` , and ``` join``` functions in perlfunc (1) and Chapter 3 of Programming Perl ; we explore random numbers further in Recipes Recipe 2.8 , Recipe 2.9 , and Recipe 2.10 ; we use random numbers in Recipe 1.9   2.6. Working with Roman Numerals 2.8. Generating Different Random Numbers