Variável escolhida aleatoriamente entre três números (10, 100 e 1000)

19

É possível ter uma variável que escolha um número aleatório de três números pré-decididos?

Amostra:

var= 10 or 100 or 1000
    
por Espen Larsen 15.12.2016 / 19:39

5 respostas

31

Use uma matriz para manter os valores e escolha entre eles usando a variável interna $RANDOM . Por exemplo,

x[0]=10     # One decade
x[1]=100    # One century
x[2]=1000   # One millennium

for ((i=1; i < 20; ++i)); do echo -n " ${x[$RANDOM%3]}"; done; echo
1000 10 10 10 10 100 10 100 100 10 10 100 100 100 10 1000 1000 1000 10

A qualidade da aleatoriedade não será a melhor possível (leia bytes de /dev/urandom para isso), mas deve ser mais do que suficiente para um script.

Nota 1: Como as pessoas observaram nos comentários, em vez de inicializar os elementos da matriz individualmente, é claro que é possível usar uma matriz litteral: x=(10 100 1000) .

Nota 2: Em vez de codificar o número de elementos na matriz, um elemento radom pode ser extraído por ${x[$RANDOM%${#x[@]}]} .

    
por 15.12.2016 / 19:46
30

Se você estiver usando bash (ou zsh ou ksh93 ), você pode apenas fazer:

echo "$((10**($RANDOM%3+1)))"

ou

var=$((10**($RANDOM%3+1)))

para atribuir a var

    
por 15.12.2016 / 22:10
20

Você também pode usar o shuf utility do GNU coreutils:

a=$(shuf -n1 -e 10 100 1000)

Usar RANDOM de acordo com as outras respostas é quase certamente mais rápido.

    
por 16.12.2016 / 00:07
8
case $(( RANDOM % 3 )) in
    0)
        var=10
        ;;
    1)
        var=100
        ;;
    2)
        var=1000
        ;;
esac
    
por 15.12.2016 / 20:05
5

Aqui está uma maneira um pouco enigmática:

printf -v var '1%0*d' $(( RANDOM % 3 + 1 )) 0

Isso atribuirá o valor aleatório a $var , conforme necessário. A string de formato printf é 1%0Nd - isso faz com que 0 seja impresso com N zeros iniciais, onde N será um inteiro aleatório no intervalo [1,3] .

    
por 16.12.2016 / 21:51