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

19

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

Amostra:

var= 10 or 100 or 1000
Espen Larsen
fonte
1
Como não programa no UNIX, não consigo escrever o código, mas aqui está outra abordagem: val = left ("1000", length = Random 2 a 4). Para ter três valores não relacionados, o código seria semelhante.
Sensii Miller

Respostas:

31

Use uma matriz para armazenar 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 os bytes /dev/urandompara isso), mas deve ser mais do que suficiente para um script.

Nota 1: Como as pessoas têm observado nos comentários, em vez de inicializar os elementos da matriz individualmente uma lata, claro, usar um Litteral array: 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[@]}]}.

AlexP
fonte
5
+1 Embora a resposta do zeppelin seja inteligente nesse caso específico, a abordagem de array é muito mais geral.
Kamil Maciorowski
4
Parece que x=(10 100 1000)cria uma matriz de um literal em bash, isso seria mais legível e mais idiomática
cat
1
@cat: As opiniões sobre legibilidade variam. Eu gosto de colocar itens individuais em linhas separadas, geralmente com comentários finais explicando o valor.
AlexP #
@ AlexP Ah, acho que não comentaria se pensasse que era de propósito. justo o suficiente embora
cat
1
@AlexP x[0]=10 # This sets the first value of x to ten. Ten is the number of fingers that humans have (excepting birth defects or mutilation). It is also the sum of 9 and 1, or product of 5 and 2. Ten is not prime. A traditional Christmas gift is ten lords a-leaping.algo assim?
Nick T
30

Se você estiver usando o bash (ou zsh ou ksh93 ), basta fazer o seguinte:

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

ou

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

atribuí-lo a var

zepelim
fonte
:). Fácil quando você vê, mas eu não. Obrigado!!
Espen Larsen
20

Você também pode usar o shufutilitário GNU coreutils :

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

Usar RANDOMconforme as outras respostas é quase certamente mais rápido.

Trauma Digital
fonte
Esta é a melhor resposta.
Tulains Córdova
8
case $(( RANDOM % 3 )) in
    0)
        var=10
        ;;
    1)
        var=100
        ;;
    2)
        var=1000
        ;;
esac
DopeGhoti
fonte
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 $varconforme necessário. A printfstring de formato é 1%0Nd- isso faz 0com que seja impresso com Nzeros à esquerda, onde Nhaverá um número inteiro aleatório no intervalo [1,3].

Trauma Digital
fonte