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)
up to (but not including) its argument. We give it an argument of 51
to get a number that can be
or more, but never 51 or more. We take the integer portion of this to
get a number from
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 Section 2.8 for a way to better
seed your random number generator.
See Also
The int
, rand
,
map
, and ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.