¿Cómo generar números aleatorios o random en Linux?

0
5506

Hoy en dia, generar números aleatorios en una computadora no es una tarea imposible ya que están al alcance de la mano algunas formas de  poder realizarlo. Sabemos que en lenguajes de programacion tales como C/C++ existe la función rand() el cual se usa para generar numeros aleatorios.

En Linux (en el shell usando bash) se cuenta con una variable que nos permite generar números aleatorios con el simple hecho de solo llamarla, esta funcion es: RANDOM.

Aquí un ejemplo:

dvarela@Latitude:~$ echo $RANDOM
8101
dvarela@Latitude:~$

Dicha función RANDOM devolverá una cadena numerica entre 0-32768, esto cada vez sea ejecutado. Ahora bien, si se requiere generar un número aleatorio que este contenido en un rango, por ejemplo entre 0 y 50, entonces el comando se ejecuta de la siguiente manera:

dvarela@Latitude:~$ echo $(($RANDOM % 50))
45
dvarela@Latitude:~$

ie,
$(($RANDOM%El_rango))

También se puede asignar el valor aleatorio a una variable tal como se muestra a continuación:

VALOR=`echo $(($RANDOM%20))`

Aunado a esto, para poder acotar los límites superior e inferior de un número a  generar se puede usar una “formula”:

<Limite Inferior> + $RANDOM % <Valor Máximo>

Donde:
Límite Inferior:  Es el número mínimo del intervalo.
Valor Máximo: Este no es el número máximo del intervalo, mas bien es  la diferencia entre éste numero y el Límite Inferior, ver tabla.

Límite inferior
Límite máximoValor máximoFórmula
160591 + $RANDOM % 59
51055 + $RANDOM % 5
128255127128 + $RANDOM % 127

 
huumm, creo que no se entiende …  veamoslo de otra manera, si queremos acotar el Limite superior e inferior del número a generar entonces lo podemos realizar de la siguiente manera:

  • Si se desea establecer un Límite Superior, utilizaremos la función módulo (%)
  • Si desaamos establecer un Límite Superior, le sumamos el número inferior.

 
Ejemplos:

Ya vimos en un ejemplo  anterior que si queremos obtener un número entre 0 y 40 usamos el comando:

dvarela@Latitude:~$ echo $((RANDOM%40))

Ahora bien, si deseamos obtener un número que esté entre 1 y 60 usaremos la funcion:

dvarela@Latitude:~$ echo $((1+RANDOM%60))

Hay que tener encuenta que el límite inferior siempre está dentro del intervalo pero el límite maximo se considera fuera del mismo y, por tanto, nunca va a salir como resultado.

Otros ejemplos.

#!/bin/sh
#
#
#

#Settings
cont=0
while [ $cont -lt 10 ] ; do
  echo $RANDOM
  let “cont += 1”
done

El resultado es:

dvarela@Latitude:~$ ./random-while.sh
12857
23477
30597
30566
23680
29280
9257
16306
26456
30884
dvarela@Latitude:~$

El ejemplo anterior genera numeros random en el intervalo 0 y 32767. Pero podemos acotarlo tal como se muestra en el siguiente ejemplo:

#!/bin/sh
#
#

#Settings
cont=0
while [ $cont -lt 10 ] ; do
  echo $((1+($RANDOM%50)))
  let “cont += 1”
done

y el resultado es:

dvarela@Latitude:~$ ./random-while-01.sh
38
37
27
42
23
9
9
25
37
10
dvarela@Latitude:~$

Observacion: ¿Que pasaria si tu shell no es bash?. Pues es muy sencillo, en caso de que el shell no sea bash, entonces usaremos los devices  /dev/random o /dev/urandom, esto funciona para cualquier version de Linux incluso para algunos BSD, Solaris, MacOS entre otros.

Aqui un ejemplo:

#!/bin/sh
#
#

#Settings
cont=0
while [ $cont -ne 10 ] ; do
   random=`dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -f1 -d” “`
   echo $((1+($random % 56)))
   let “cont += 1”
done

y el resultado es:
dvarela@Latitude:~$ ./random-while-02.sh
43
27
51
8
1
36
5
19
47
27
dvarela@Latitude:~$


Un par de ejemplos mas, ahora con el ciclo for …

#!/bin/sh
#
#

#Settings
for ((cont=15;cont<=115;cont+=1)); do
echo “Numero aleatorio ‘$RANDOM’ “
done


#!/bin/sh
#
#

#Settings
VALOR=`expr $RANDOM % 56`
echo “El valor es ‘$VALOR’ “
echo


#!/bin/sh
#
#

#Settings
LINF=$1
LSUP=$2
VMAX=$(($LSUP-$LINF))

CONTA=0
while [ $CONTA -lt 60 ] ; do
  echo $(($LINF+($RANDOM%$VMAX)))
  let “CONTA += 1”
done

Suerte