rand() not so random in perl
I have a Perl script that gives me a 50 character string of random numbers, letters and some special characters. I am inputting them in a database. Now, given the length of the string and the amount of characters, I wouldn't think that duplicates would be easily created.
Here's the nifty nugget of code that creates the string:
my $random_id='';
my @c = ( "A" .. "Z", "a" .. "z", 0 .. 9, qw(! @ $ % ^ & *) );
$random_id = join '', map $c[rand @c] , 1 .. 50;
It produces strings like:
C1Qt8L7开发者_运维问答E7QUD%lkxnh9yjZ2njF0iMj!1o^4DmTbVNhQB9%dke@
The problem is it will duplicate an exact string every once and a while among unique ones, and more than once on some strings. And this is out of say 20 strings. It's bizarre. I can work around it and find a solution... but this perplexes me a bit. Would like to know why. Anybody have an idea?
You need to use srand to seed the random number generator otherwise it will generate the same number series.
http://perldoc.perl.org/functions/srand.html
Edit:
According to the doc atthe url, if the perl version is before 5.004 then it won't automatically call that function. So check the perl version you're running under.
you can also see String::Random - for generating random strings based on a pattern.
For GOOD random numbers, consider using Math::Random::MT.
精彩评论