Generating Repeatable Random Number Sequences (Perl Cookbook, 2nd Edition)

## 2.7. Generating Repeatable Random Number Sequences

### 2.7.1. Problem

Every time you run your program, you get a different sequence of (pseudo-)random numbers. But you want a reproducible sequence, useful when running a simulation, so you need Perl to produce the same set of random numbers each time.

### 2.7.2. Solution

Use Perl's `srand` function:

>     srand EXPR;   # use a constant here for repeated sequences

### 2.7.3. Discussion

Making random numbers is hard. The best that computers can do, without special hardware, is generate "pseudo-random" numbers, which are evenly distributed in their range of values. These are generated using a mathematical formula, which means that given the same seed (starting point), two programs will produce identical pseudo-random numbers.

The `srand` function creates a new seed for the pseudo-random number generator. If given an argument, it uses that number as the seed. If no argument is given, `srand` uses a value that's reasonably difficult to guess as the seed.

If you call `rand` without first calling `srand` yourself, Perl calls `srand` for you, choosing a "good" seed. This way, every time you run your program you'll get a different set of random numbers. Ancient versions of Perl did not call `srand`, so the same program always produced the same sequence of pseudo-random numbers every time the program was run. Certain sorts of programs don't want a different set of random numbers each time; they want the same set. When you need that behavior, call `srand` yourself, supplying it with a particular seed:

>     srand( 42 );  # pick any fixed starting point

Don't call `srand` more than once in a program, because if you do, you'll start the sequence again from that point. Unless, of course, that's what you want.

Just because Perl tries to use a good default seed does not necessarily guarantee that the numbers generated are cryptographically secure against the most intrepid crackers. Textbooks on cryptography are usually good sources of cryptographically secure random number generators.

### 2.7.4. See Also

The `srand` function in perlfunc(1) and Chapter 29 of Programming Perl; Recipe 2.6 and Recipe 2.8; Bruce Schneier's excellent Applied Cryptography (John Wiley & Sons)

Copyright © 2003 O'Reilly & Associates. All rights reserved.