In ksh
, Bash, Zsh, Yash ou BusyBox sh
:
[ "$RANDOM" -lt 3277 ] && do_stuff
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 é avaliada; portanto, o acima fornece (próximo a) uma chance em dez.
Você pode usar isso para produzir uma função que se comporte conforme descrito na sua pergunta, pelo menos no Bash:
function chance {
[[ -z $1 || $1 -le 0 ]] && return 1
[[ $RANDOM -lt $((32767 / $1 + 1)) ]]
}
Esquecer de fornecer um argumento, ou fornecer um argumento inválido, produzirá o resultado 1, portanto chance && do_stuff
nunca o será do_stuff
.
Esta utiliza a fórmula geral para a “1 em n ” utilizando $RANDOM
, o que é [[ $RANDOM -lt $((32767 / n + 1)) ]]
, dando um (⎣32767 / n ⎦ + 1) em 32768 acaso. Valores n
que não são fatores de 32768 introduzem um viés por causa da divisão desigual no intervalo de valores possíveis.