Perl Programming Documentation
Download Perl
Explore

Manual

- Overview
- Tutorials
- FAQs
- History / Changes
- License

Reference

- Language
- Functions
- Operators
- Special Variables
- Pragmas
- Utilities
- Internals
- Platform Specific

Modules

- A • B • C • D • E
- F • G • H • I • L
- M • N • O • P • S
- T • U • X

Tools

- Preferences

# srand

Perl 5 version 16.0 documentation
Go to top
Show recent pages
Recently read

# srand

Perl functions A-Z | Perl functions by category | The 'perlfunc' manpage

- srand EXPR

- srand

  Sets and returns the random number seed for the `rand` operator.

  The point of the function is to "seed" the `rand` function so that `rand` can produce a different sequence each time you run your program. When called with a parameter, `srand` uses that for the seed; otherwise it (semi-)randomly chooses a seed. In either case, starting with Perl 5.14, it returns the seed. To signal that your code will work only on Perls of a recent vintage:

          use 5.014;	# so srand returns the seed

  If `srand()` is not called explicitly, it is called implicitly without a parameter at the first use of the `rand` operator. However, this was not true of versions of Perl before 5.004, so if your script will run under older Perl versions, it should call `srand`; otherwise most programs won't call `srand()` at all.

  But there are a few situations in recent Perls where programs are likely to want to call `srand`. One is for generating predictable results generally for testing or debugging. There, you use `srand($seed)`, with the same `$seed` each time. Another case is that you may want to call `srand()` after a `fork()` to avoid child processes sharing the same seed value as the parent (and consequently each other).

  Do not call `srand()` (i.e., without an argument) more than once per process. The internal state of the random number generator should contain more entropy than can be provided by any seed, so calling `srand()` again actually loses randomness.

  Most implementations of `srand` take an integer and will silently truncate decimal numbers. This means `srand(42)` will usually produce the same results as `srand(42.1)`. To be safe, always pass `srand` an integer.

  In versions of Perl prior to 5.004 the default seed was just the current `time`. This isn't a particularly good seed, so many old programs supply their own seed value (often `time ^ $$` or `time ^ ($$ + ($$ << 15))` ), but that isn't necessary any more.

  Frequently called programs (like CGI scripts) that simply use

          time ^ $$

  for a seed can fall prey to the mathematical property that

          a^b == (a+1)^(b+1)

  one-third of the time. So don't do that.

  A typical use of the returned seed is for a test program which has too many combinations to test comprehensively in the time available to it each run. It can test a random subset each time, and should there be a failure, log the seed used for that run so that it can later be used to reproduce the same results.

  `rand()` is not cryptographically secure. You should not rely on it in security-sensitive situations. As of this writing, a number of third-party CPAN modules offer random number generators intended by their authors to be cryptographically secure, including: Data::Entropy, Crypt::Random, Math::Random::Secure, and Math::TrulyRandom.