2010-12-06 17 views
5

Tengo un script Perl que me da una cadena de 50 caracteres de números aleatorios, letras y algunos caracteres especiales. Los estoy ingresando en una base de datos. Ahora, dada la longitud de la cadena y la cantidad de caracteres, no creo que los duplicados se creen fácilmente.Rand() no es tan aleatorio en Perl

Aquí está la pepita ingeniosa de código que crea la cadena:

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

Produce cadenas como:

C1Qt8L7E7QUD% lkxnh9yjZ2njF0iMj 1o^4DmTbVNhQB9% DKE @

El El problema es que duplicará una cadena exacta de vez en cuando entre las únicas, y más de una vez en algunas cadenas. Y esto está fuera de decir 20 cuerdas. Es extraño. Puedo solucionarlo y encontrar una solución ... pero esto me deja perplejo un poco. Me gustaría saber por qué. ¿Alguien tiene una idea?

Respuesta

8

Debe usar srand para inicializar el generador de números aleatorios, de lo contrario generará la misma serie numérica.

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

Editar:

De acuerdo con el documento atthe url, si la versión de Perl está delante de 5.004 entonces no va a llamar automáticamente esa función. Así que comprueba la versión de Perl con la que estás ejecutando.

+0

Hola Paul. ¡Gracias por el comentario! – DataHerder

+0

Woops ... no pude responder. Si cambio rand() a srand(), ahora produce simplemente BBBBBBBBBBB .. cada vez. :/ – DataHerder

+0

perl 5.1 por cierto, – DataHerder

3

también puede ver String::Random - para generar cadenas aleatorias basadas en un patrón.

+1

también algo como Data :: UUID (http://search.cpan.org/dist/Data-UUID/) puede ser apropiado si las cadenas se utilizan en una base de datos (por ejemplo, como claves primarias únicas persistentes) – plusplus

+0

@ plusplus Pero eso abre la lata de gusanos: "¿Debería un UUID [alguna vez] ser una clave primaria?" :-) –