¿Cómo obtengo aleatoriedad en la línea de comandos?

11

¿Cómo ejecutar aleatoriamente un comando dentro de la lista de comandos especificada? Útil para elegir aleatoriamente el sonido de inicio, el fondo de pantalla o la ejecución de comandos.

En general, si tengo comandos para la ejecución de la siguiente manera, ¿cómo obtengo aleatoriedad :?

#!/bin/bash
<command_1>
<command_2>
<command_3>
.
.
.
<command_n>

¡Entonces quiero ejecutar aleatoriamente solo un comando de las posibilidades anteriores cuando se ejecuta el script!

¿Como hacer eso?

Pandya
fuente
Ejemplo práctico: askubuntu.com/a/257471/163331
Parto
@Parto ya agregué como respuesta antes
Pandya
No estaba tratando de responder, solo estaba dando un ejemplo donde se puede usar.
Parto

Respuestas:

21

La variable $RANDOM(en realidad, una función bash) devuelve un número aleatorio de 0 a 32767 inclusive.

Por lo general, desea limitar su rango dividiéndolo por algún número y tomar el resto, por ejemplo.

# output a random number 0 to 3
echo $((RANDOM % 4))

En este ejemplo simplista, estará ligeramente sesgado para cualquier divisor que no se divida por igual en 32768 (p. Ej., Cualquier cosa que no sea una potencia de dos), pero en su escenario no creo que tenga problemas por un ligero sesgo.

Para elegir un archivo aleatorio, nombraría a sus archivos algo así como:

file0.jpg
file1.jpg
file2.jpg
file3.jpg

Y luego puedes elegir uno aleatorio con

# output a random file from file0.jpg to file3.jpg
echo "file$((RANDOM % 4)).jpg"
thomasrutter
fuente
1
Es posible que desee publicarlo como su propia respuesta, entonces podría ganar su reputación.
thomasrutter
uso útil de RANDOM, acepté!
Pandya
1
Tenga en cuenta que RANDOM% N no da como resultado una distribución igual a menos que el número de valores posibles de RANDOM (32768) sea divisible por N. Para ver esto, imagine que el rango de RANDOM fue 0-4 (5 valores posibles), y N es 2: hay tres formas para que $ RANDOM% 2 produzca 0 (si $ RANDOM produce 0, 2, 4) pero dos formas para que produzca 1 (1, 3). Para una distribución igual, tendría que encontrar el mayor múltiplo de N que sea menor que 32767 e ignorar cualquier valor aleatorio que sea mayor que eso. En el ejemplo anterior, eso equivaldría a ignorar 5, que es mayor que 4.
Doval
@Doval Dije eso en mi respuesta, ¿lo viste?
thomasrutter
@neon_overload Mi mal, me perdí ese bit.
Doval
7

De acuerdo con la respuesta @neon_overload (usando RANDOM),
puedo poner un RANDOMscript de ejemplo de la siguiente manera (para 4 comandos):

#!/bin/bash
random_selection=$((RANDOM % 4))

case $random_selection in

  0)
  <command_1>
  ;;

  1)
  <command_2>
  ;;

  2)
  <command_3>
  ;;

  3)
  <command_4>
  ;;

esac
Pandya
fuente
2

Si desea aleatoriedad a través de un sitio externo en lugar de uno generado por su computadora, puede usar este script:

curl "http://www.random.org/integers/?num=1&min=$1&max=$2&col=1&base=10&format=plain&rnd=new"

Ejecutar como rand (MIN) (MAX) (suponiendo que guarde como / usr / bin / rand)

Es posible que deba instalar curl primero (sudo apt-get install curl) si aún no está instalado.

iggyvolz
fuente
0

Puede usar el shufcomando de GNU coreutils .

NAME
       shuf - generate random permutations

SYNOPSIS
       shuf [OPTION]... [FILE]
       shuf -e [OPTION]... [ARG]...
       shuf -i LO-HI [OPTION]...

DESCRIPTION
       Write a random permutation of the input lines to standard output

Ejemplo:

$ shuf -i 1-5
4
1
2
5
3

$ shuf -e Debian Ubuntu Trisquel 
Trisquel
Debian
Ubuntu

Ahora, para obtener una entrada aleatoria, puede usar -n 1qué salidas de primera línea.

Ejemplo para imprimir un número aleatorio del 1 al 100:

$ shuf -i 1-100 -n 1
37

Si filetiene los siguientes contenidos:

$ cat file
command-1
command-2
command-3
command-4
command-5

También puedes hacer algo como:

$ shuf file -n 1
command-3
Pandya
fuente