Translate

viernes, 25 de octubre de 2013

$RANDOM numeros aleatorios con linux ( bash )


¿Que es RANDOM?

$RANDOM es una función que esta dentro de Bash que nos retorna un número entero pseudoaleatorio en el rango: 0 - 32767.

¿Como generar el numero aleatorio?
                                                         DesdeLinux  : bash - Terminal                                                                                           □ _ X
fiti80@smx ~ $ echo $RANDOM
19580

el resultado de hacer echo $RANDOM a sido 19580, puede dar cualquier resultado de 0 a 32767.

¿Como generamos un numero aleatorio del 0 al 29?
                                                         DesdeLinux  : bash - Terminal                                                                                           □ _ X
fiti80@smx ~ $ echo $((RANDOM%30))
19

Si nos fijamos en el ejemplo, para que nos genere un numero de el 0 al 29 en la linea de comandos a $RANDOM le hemos añadido el operador aritmético % (modulo).

Para que se entienda mejor pondré los operadores aritméticos y su significado

Símbolo Descripción
+ Suma
* Multiplicación
- Resta
/ División entera
% Resto de la división entera
(  ) Los paréntesis son para agrupar las operaciones

Es decir, se genera un numero que es dividido por 30 y se nos devolverá su resto, de esta forma solo devolverá un numero 0 al 29.

Yo quiero que se genere un numero del 1 al 30 ¿como lo hago?
                                                         DesdeLinux  : bash - Terminal                                                                                           □ _ X
fiti80@smx ~ $ echo $((1+RANDOM%30))
29

Mirando el ejemplo de arriba, se deduce que RANDOM%30 a dado como resultado 28 y se le ha sumado 1, dando como resultado final 29. Es decir el resultado de RANDOM%30 siempre es incrementado en una unidad. Si en el ejemplo anterior se generaba un numero del 0 al 29 añadiéndole una unidad el rango pasa a ser del 1 al 30. Si lo que queremos es que el rango sea del 0 al 30 tendremos que plasmarlo de esta forma    echo $((RANDOM%31))

¿Se puede combinar varios operadores con RANDOM?

Claro que si, de hecho voy a añadir la introducción de varios ejemplos y su salida en el terminal
                                                         DesdeLinux  : bash - Terminal                                                                                           □ _ X
fiti80@smx ~ $ echo $((RANDOM+30))
20251
fiti80@smx ~ $ echo $((RANDOM-30))
405
fiti80@smx ~ $ echo $((RANDOM*30))
814710
fiti80@smx ~ $ echo $((RANDOM/30))
523

¿como añado RANDOM a una variable para un bash script?
Variable=`echo $(($RANDOM))`

Variable=$RANDOM

¿Hay alguna forma para generar números que no sea con la función RANDOM?

Si, con el comando shuf  que escribe una permutación aleatoria de las líneas de entrada a la salida estándar. Pondré un ejemplo para que se entienda mejor:
                                                         DesdeLinux  : bash - Terminal                                                                                           □ _ X
fiti80@smx ~ $ shuf  -n 1 -i 0-30
14

Si nos fijamos en la linea tenemos dos opciones -n y -i. Con -n indicaremos las veces que queremos que se genere un numero y con -i indicamos el rango. En el ejemplo de arriba queremos que se genere solo un numero ( -n 1 ) y queremos que sea de 0 al 30 ( -i 0-30 ).

Otro ejemplo, esta vez haremos que se genere 4 números con un rango del 300 al 1600
                                                         DesdeLinux  : bash - Terminal                                                                                           □ _ X
fiti80@smx ~ $ shuf  -n 4 -i 300-1600
1507
1306
331
1269

Si nos damos cuenta los números se muestran en vertical, pero también podemos hacer que se muestren en horizontal.

De esta forma hacemos que se muestren en horizontal.
                                                         DesdeLinux  : bash - Terminal                                                                                           □ _ X
fiti80@smx ~ $ echo $(shuf -n 24 -i 0-44 )
28 32 17 13 34 9 22 39 42 33 19 21 38 26 35 5 25 10 24 40 37 11 7 16

Para mas información de este comando podemos poner en el terminal $ man shuf  o entrar en este enlace http://man.redkaos.net/man1/shuf.1 .

¿Hay alguna otra forma mas para generar números?

Si con  /dev/random es un archivo especial que sirve como un generador de números aleatorios, o un generador de números seudo-aleatorios.

Ahora mostrare un ejemplo para generar números:
                                                         DesdeLinux  : bash - Terminal                                                                                           □ _ X
fiti80@smx ~ $ cat /dev/urandom| tr -dc '0-9' | fold -w 8| head -1
81409899

Bueno explicare las opciones que entiendo:
cat /dev/urandom --> muestra el contenido del archivo urandom.
tr -dc '0-9'  --> se indica un rango por dígito.
flod -w 8   --> indicamos cuantos dígitos tendrá el numero generado.
head -1    --> el numero de números aleatorios que queremos generar.

Es decir cat /dev/urandom muestra el contenido del archivo, su salida es recogida por el comando tr que se encarga de traducir los caracteres de esa salida y elimina los que no estén en el rango especificado. La salida de tr es recogida por el comando fold que divide esta salida en lineas, en este caso de ocho caracteres, finalmente la salida de fold sera mostrada por el comando head, en el caso del ejemplo solo muestra la primera linea de la salida de fold.

¿Podemos generar passwords con /dev/urandom ?

Claro que si, un ejemplo de esto:
                                                         DesdeLinux  : bash - Terminal                                                                                           □ _ X
fiti80@smx ~ $ cat /dev/urandom| tr -dc 'A-Za-z0-9_' | fold -w 8| head -5
Bs6Unlvf
1T00r8iP
dFOVujtU
WzNpsdDm
FWae7vAU

El procesamiento de este ejemplo es igual que el anterior ejemplo, con la diferencia que hemos añadido un rango diferente al comando tr y hemos mostrado con head 5 lineas.

Bueno, un saludo y con esto finalizo el articulo, para alguna duda comenten el articulo.

No hay comentarios:

Publicar un comentario