En otro artículo ya comenté que para hacer una especie de "cara o cruz" en el que de forma aleatoria nos muestre 0 o 1, $RANDOM%1 no funciona, ya que siempre da 0. En un comentario me decían que dividir una cantidad entre 1 no da decimales. Es cierto, nunca podrá haber rendondeo a la alza porque nunca podrá haber redondeo y, por lo tanto, nunca podrá salir la cantidad indicada como límite superior del rango.
Voy a hacer un script en el que saquemos muchos números aleatorios. Por ejemplo, que mil veces haga una tirada aleatoria con resultados del 0 al 1.000.
#!/bin/bash
for i in $(seq 1 1000)
do
for x in $(seq 1 1000)
do
let numero=$((RANDOM%$x))
if [ $numero -eq $x ]
then
echo $x
fi
done
done
Al ejecutarlo no sale nada. Y repito, y repito, y repito la ejecución del script. Siempre sin ningún resultado. ¿Me habré equivocado? Voy a acumular las veces que el resultado no coincide con el límite superior:
#!/bin/bash
let nocoincide=0
for i in $(seq 1 1000)
do
for x in $(seq 1 1000)
do
let numero=$((RANDOM%$x))
if [ $numero -eq $x ]
then
echo $x
else
let nocoincide++
fi
done
done
echo "Han salido "$nocoincide" coincidencias con el límite superior"
Ahora el resultado siempre es el mismo:
Han salido 1000000 coincidencias con el límite superior
Pues igual no he sido yo el que me he equivocado. Aunque es cierto que al ser aleatorio puede que ese número no salga. Pero si varias veces repito un millón de tiradas y nunca coincide, algo raro pasa. Quizá lo raro es que quien afirma que para sacar un número aleatorio entre 0 y $x se puede conseguir con let numero=$((RANDOM%$x))
se equivoca... o que nunca se ha parado a comprobarlo.