Aleatoriedad y aleatoriedad ponderada en Shell Script

Trabajando con aleatoriedades, hay veces que queremos que todas las opciones tengan las mismas posibilidades de ocurrir. Como si lanzamos una moneda que no esté trucada y unas veces saldrá cara y otras veces saldrá cruz.

#!/bin/bash

coin=$(shuf -i 0-1 -n 1)
if [ $coin -eq 0 ]
then
    echo "Hola, "$USER
else
    echo "Hola, "$USER", ¿qué tal estás?"
fi

Con shuf -i 0-1 -n 1 generamos una lista de números que van desde 0 a 1 (-i 0-1) y, de esa lista, extraemos un elemento (-n 1), por lo tanto, lo que recibimos en la variable coin es un 1 o un 0, con las mismas posibilidades de recibir uno u otro valor.

En la siguiente línea, comprobamos si el valor de coin es 0. Si es así, ejecuta un bloque de código y si no, ejecuta otro bloque de código. Comparamos la igualdad con -eq.

En caso de que trabajemos con más posibilidades, es más cómodo usar case:

#!/bin/bash

dice=$(shuf -i 1-6 -n 1)

case $dice in
    1)
        echo "Hola, "$USER"."
        ;;
    2)
        echo "Hola, ¿qué tal estás?"
        ;;
    3)
        echo "Hola, "$USER", ¿qué tal estás?"
        ;;
    4)
        echo "¿Qué tal estás, $USER?"
        ;;
    5)
        echo "Hola, ¿qué tal, "$USER"?"
        ;;
    6)
        echo "¿Qué tal, "$USER"? Me alegro de saludarte."
        ;;
esac

 

Hemos convertido la moneda, con sus dos opciones de cara y cruz por un dado con 6 opciones que tienen las mismas posibilidades de ocurrir (shuf -i 1-6 -n 1).

Si queremos que haya más posibilidades de que se ejecute un bloque de código que otro, podemos combinar las dos opciones anteriores: por un lado, extraemos aleatoriamente un número alto y sólo se ejecuta un bloque de código cuando se de un resultado concreto:

#!/bin/bash

dice=$(shuf -i 1-6 -n 1)

if [ $dice -eq 1 ]
then
    echo "Hola, "$USER
else
    echo "Hola, "$USER", ¿qué tal estás?"
fi

 

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada.