Como obtenho aleatoriedade na linha de comando?

11

Como executar aleatoriamente um comando na lista de comandos especificada? Útil para escolher aleatoriamente o som de inicialização, o papel de parede ou a execução de comandos.

Em geral, se eu tiver comandos para execução da seguinte maneira, como obtenho aleatoriedade :?

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

Então eu quero executar aleatoriamente apenas um comando acima das possibilidades quando o script é executado!

Como fazer isso?

Pandya
fonte
Exemplo prático: askubuntu.com/a/257471/163331
Parto
@Parto Já adicionado como resposta antes
Pandya
Eu não estava tentando responder, estava apenas dando um exemplo onde ele pode ser usado.
Parto

Respostas:

21

A variável $RANDOM(na verdade, uma função bash) retorna um número aleatório de 0 a 32767, inclusive.

Você normalmente deseja limitar seu alcance, dividindo-o por algum número e tendo o restante, por exemplo.

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

Neste exemplo simplista, será um pouco tendencioso para qualquer divisor que não se divida igualmente em 32768 (por exemplo, qualquer coisa que não seja uma potência de dois), mas no seu cenário, não acho que você se incomodaria. por um leve viés.

Para escolher um arquivo aleatório, você deve nomear seus arquivos da seguinte forma:

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

E então você pode escolher um aleatório com

# output a random file from file0.jpg to file3.jpg
echo "file$((RANDOM % 4)).jpg"
thomasrutter
fonte
1
Você pode publicá-lo como sua própria resposta - isso pode lhe render reputação.
thomasrutter
uso útil de RANDOM, eu aceitei!
Pandya
1
Observe que RANDOM% N não resulta em uma distribuição igual, a menos que o número de valores possíveis de RANDOM (32768) seja divisível por N. N é 2: existem três maneiras para que $ RANDOM% 2 produza 0 (se $ RANDOM produz 0, 2, 4), mas há duas maneiras para gerar 1 (1, 3). Para uma distribuição igual, você teria que encontrar o maior múltiplo de N menor que 32767 e ignorar quaisquer valores aleatórios maiores que isso. No exemplo anterior, isso equivalia a ignorar 5, que é maior que 4.
Doval
@Doval Eu disse que na minha resposta, você viu?
thomasrutter
@neon_overload Meu mal, eu perdi esse pedaço.
Doval
7

De acordo com a resposta @neon_overload (using RANDOM),
posso colocar o RANDOMexemplo de script da seguinte forma (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
fonte
2

Se você deseja aleatoriedade através de um site externo, e não do gerado pelo seu computador, você pode usar este script:

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

Executar como rand (MIN) (MAX) (supondo que você salve como / usr / bin / rand)

Talvez você precise instalar o curl primeiro (sudo apt-get install curl) se ele ainda não estiver instalado.

iggyvolz
fonte
0

Você pode usar o shufcomando do 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

Exemplo:

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

$ shuf -e Debian Ubuntu Trisquel 
Trisquel
Debian
Ubuntu

Agora, para obter uma entrada aleatória, você pode usar as -n 1saídas de primeira linha.

Exemplo para imprimir números aleatórios de 1 a 100:

$ shuf -i 1-100 -n 1
37

Se você tiver o fileseguinte conteúdo:

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

Você também pode fazer algo como:

$ shuf file -n 1
command-3
Pandya
fonte