Eu quero uma maneira de executar um comando aleatoriamente, digamos 1 em cada 10 vezes. Existe um coreutil embutido ou GNU para fazer isso, idealmente algo como:
chance 10 && do_stuff
onde do_stuff
é executado apenas 1 em 10 vezes? Eu sei que poderia escrever um script, mas parece uma coisa bastante simples e eu queria saber se existe uma maneira definida.
Em
ksh
, Bash, Zsh, Yash ou BusyBoxsh
:A
RANDOM
variável especial dos shells Korn, Bash, Yash, Z e BusyBox produz um valor inteiro decimal pseudo-aleatório entre 0 e 32767 toda vez que é avaliado, então o acima dá (próximo a) uma chance em dez.Você pode usar isso para produzir uma função que se comporta conforme descrito em sua pergunta, pelo menos no Bash:
Esquecer de fornecer um argumento ou fornecer um argumento inválido produzirá um resultado de 1, portanto
chance && do_stuff
, nuncado_stuff
.Isso usa a fórmula geral para “1 em n ” usando
$RANDOM
, que é[[ $RANDOM -lt $((32767 / n + 1)) ]]
, dando uma chance (⎣32767 / n ⎦ + 1) em 32768. Valoresn
que não são fatores de 32768 introduzem um viés devido à divisão desigual no intervalo de valores possíveis.Solução não padrão:
[ $(date +%1N) == 1 ] && do_stuff
Verifique se o último dígito da hora atual em nanossegundos é 1!
Uma alternativa ao uso
$RANDOM
é oshuf
comando:vai fazer o trabalho. Também é útil para selecionar aleatoriamente linhas de um arquivo, por exemplo. para uma lista de reprodução de música.
Melhorando a primeira resposta e tornando muito mais óbvio o que você está tentando alcançar:
Não tenho certeza se você quer aleatoriedade ou periodicidade ... Para periodicidade:
Você pode misturá-lo com o truque "$RANDOM" acima para produzir algo mais caótico, por exemplo:
para i em
seq 1 1000 $RANDOM
; do echo $i;concluídoHTH :-)