Rand () не так случайно в Perl - PullRequest
5 голосов
/ 06 декабря 2010

У меня есть Perl-скрипт, который дает мне 50-символьную строку случайных чисел, букв и некоторых специальных символов.Я ввожу их в базу данных.Теперь, учитывая длину строки и количество символов, я не думаю, что дубликаты будут легко созданы.

Вот изящный слепок кода, который создает строку:

my $random_id='';
my @c = ( "A" .. "Z", "a" .. "z", 0 .. 9, qw(! @ $ % ^ & *) );
$random_id = join '', map $c[rand @c] , 1 .. 50;

Он генерирует строки вроде:

C1Qt8L7E7QUD% lkxnh9yjZ2njF0iMj! 1o ^ 4DmTbVNhQB9% dke @

Проблема заключается в том, что она будет дублировать точную строку каждый раз и в то же времяуникальные, и не раз на некоторых строках.И это, скажем, 20 строк.Это странно.Я могу обойти это и найти решение ... но это немного озадачивает меня.Хотелось бы знать почему.У кого-нибудь есть идея?

Ответы [ 3 ]

8 голосов
/ 06 декабря 2010

Вам нужно использовать srand для заполнения генератора случайных чисел, иначе он сгенерирует тот же ряд чисел.

http://perldoc.perl.org/functions/srand.html

Редактировать:

Согласно URL документа, если версия perl до 5.004, то она не будет автоматически вызывать эту функцию. Так что проверьте версию Perl, под которой вы работаете.

3 голосов
/ 07 декабря 2010

Для ХОРОШИХ случайных чисел рассмотрите возможность использования Math :: Random :: MT .

3 голосов
/ 06 декабря 2010

вы также можете увидеть String :: Random - для генерации случайных строк на основе шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...