Scripting: Generar un numero aleatorio dentro de un rango con Bash

Si necesitamos una semilla o genera un número aleatorio en nuestros scripts con Bash podemos hacer uso de la variable RANDOM.

Ejemplo: echo $RANDOM

Te devolvera un string numerico entre 0 y 32768, cada vez que la ejecutes. El caso es por ejemplo si necesitas generar un número aleatorio dentro de un rango, por ejemplo entre 0 y 20, entonces ejecutarias:

echo $(($RANDOM%20))

Es decir, $(($RANDOM%aqui_rango))

Que necesitas un valor entre 0 y 50 entonces seria:

echo $(($RANDOM%50))

Para asignarle el valor aleatorio a una variable ejecuta:

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

6 Responses to “Scripting: Generar un numero aleatorio dentro de un rango con Bash”


  1. 1 Alfonso octubre 27, 2010 de 7:18 pm

    Eso no es cierto.

    Por un lado no sé como está hecha la implementación de $RANDOM, pero lo lógico sería que devolviera un número entre 0 y 32767 o entre 1 y 32768, pero en cualquier caso tenemos otro problema.

    $RANDOM devolverá un 1 una vez de cada 32768 veces de media, eso significa que $(($RANDOM%50)) devolverá un 1 656 veces de cada 32768 veces de media, la probabilidad es 41/2048=0.0200195, sin embargo, $(($RANDOM%50)) devolverá un 49 655 veces de cada 32768 veces de media, la probabilidad es de 655/32768=0.01998901, es decir, hay números que tiene mas probabilidad de salir (del 0 al 17) y número que tienen menos probabilidad de salir (del 18 al 49). En general no debe de importar mucho, pero hay aplicaciones que si requieren de verdad una aleatoriedad máxima.

    Saludos.

  2. 2 superpiwi octubre 27, 2010 de 7:40 pm

    Perdona Alfonso, pero me he perdido. no se tampoco como de aleatoria es la semilla de $RANDOM, pero al menos en mi caso, para lo que la queria usar, si me sirve.

  3. 4 Sergio octubre 31, 2010 de 9:12 pm

    Lo que hace % es devolver el resto de la división entre el valor de RANDOM y el número que queramos. Así que:

    $RANDOM%20 devolverá un número entre 0 y 19, y no entre 0 y 20, porque el resto de una división no puede ser nunca igual o mayor al divisor.

  4. 5 Gen X noviembre 4, 2010 de 6:34 am

    hay forma de ponerle interfaz al script? pienso que seria genial para jugar rol, es algo que siempre quise hacer pero no sabia como se generaban numeros aleatorios, asi podria al fin tener el legendario dado de 100 caras 😀

  5. 6 Fuste agosto 22, 2011 de 4:06 pm

    Otra forma de generar un número aleatorio, aunque esta vez sería este comando:

    date “+%N” | cut -c 9

    Eso nos daría la fecha en nanosegundos con 9 cifras. Si queremos una sola cifra pues pones el “cut -c 9” (la última cifra siempre es más aleatoria porque es la más pequeña del número). Si queremos 2 cifras pues ponemos el “cut – c 8,9”. Si queremos tres cifras pues “cut -c 7-9” (comenzamos a usar el guión)

    Lo único malo que tiene esto es si queremos sacar muchos números aleatorios seguidos en poco tiempo, pues esto es un número aleatorio en base a una fecha con su hora. Es decir, que si hacemos un for con ese comando podemos ver que:

    $ for i in `seq 1 1 500`; do date “+%N”; done



    308311367
    310807595
    313273093
    315725181
    318186139
    320671403
    323360117
    325733353
    328335462
    330694870
    333259893
    335858999
    338375622
    340798446



    Creo que queda claro ¿no? Las cifras de la izquierda se asemejan más en cortos espacio de tiempo, lógico, y las de la derecha son más “aleatorias”

    Bueno, después de este tostón me retiro xD. Gracias ^^


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s







¿Es compatible tu equipo con Ubuntu?


( Muchos fondos de pantalla, aqui )

DESCARGATE SCIFI LIFE

365 Dias de Soledad
Me debes los sueños, las promesas y las noches rotas. Me debes la paz, la sonrisa y la esperanza robadas. Me debes la sangre, las lágrimas y el sudor vertido. Me debes las noches vacías, los abrazos anhelados. Me debes un beso de ajenjo de tu amarga boca.

The Ubuntu Counter Project - user number # 11961
Geo Visitors Map
octubre 2010
L M X J V S D
« Sep   Nov »
 123
45678910
11121314151617
18192021222324
25262728293031

Blog Stats

  • 30.955.806 hits

A %d blogueros les gusta esto: