In ksh
, Bash, Zsh, Yash or BusyBox sh
:
[ "$RANDOM" -lt 3277 ] && do_stuff
The RANDOM
special variable of the Korn, Bash, Yash, Z and BusyBox shells produces a pseudo-random decimal integer value between 0 and 32767 every time it’s evaluated, so the above gives (close to) a one-in-ten chance.
You can use this to produce a function which behaves as described in your question, at least in Bash:
function chance {
[[ -z $1 || $1 -le 0 ]] && return 1
[[ $RANDOM -lt $((32767 / $1 + 1)) ]]
}
Forgetting to provide an argument, or providing an invalid argument, will produce a result of 1, so chance && do_stuff
will never do_stuff
.
This uses the general formula for “1 in n” using $RANDOM
, which is [[ $RANDOM -lt $((32767 / n + 1)) ]]
, giving a (⎣32767 / n⎦ + 1) in 32768 chance. Values of n
which aren’t factors of 32768 introduce a bias because of the uneven split in the range of possible values.