En ksh
, Bash, Zsh, Yash u BusyBox sh
:
[ "$RANDOM" -lt 3277 ] && do_stuff
La RANDOM
variable especial de los shells Korn, Bash, Yash, Z y BusyBox produce un valor entero decimal pseudoaleatorio entre 0 y 32767 cada vez que se evalúa, por lo que lo anterior da (cerca de) una posibilidad de uno en diez.
Puede usar esto para producir una función que se comporte como se describe en su pregunta, al menos en Bash:
function chance {
[[ -z $1 || $1 -le 0 ]] && return 1
[[ $RANDOM -lt $((32767 / $1 + 1)) ]]
}
Olvidar proporcionar un argumento, o proporcionar un argumento no válido, producirá un resultado de 1, por chance && do_stuff
lo que nunca lo hará do_stuff
.
Esto usa la fórmula general para "1 en n " usando$RANDOM
, que es [[ $RANDOM -lt $((32767 / n + 1)) ]]
, dando un (⎣32767 / n ⎦ + 1) en 32768 posibilidades. Los valores de los n
cuales no son factores de 32768 introducen un sesgo debido a la división desigual en el rango de valores posibles.