В ksh
, Bash, Zsh, Yash или BusyBoxsh
:
[ "$RANDOM" -lt 3277 ] && do_stuff
Специальная переменная RANDOM
оболочек Korn, Bash, Yash, Z и BusyBox создает псевдо -случайное десятичное целое число от 0 до 32767 каждый раз, когда она оценивается, поэтому приведенное выше дает (близкое к )один -из -десяти шансов.
Вы можете использовать это для создания функции, которая ведет себя так, как описано в вашем вопросе, по крайней мере, в Bash:
function chance {
[[ -z $1 || $1 -le 0 ]] && return 1
[[ $RANDOM -lt $((32767 / $1 + 1)) ]]
}
Если вы забыли указать аргумент или указали недопустимый аргумент, результат будет равен 1, поэтому chance && do_stuff
никогда не будет do_stuff
.
Здесь используется общая формула для «1 в n » с использованием $RANDOM
, то есть [[ $RANDOM -lt $((32767 / n + 1)) ]]
,давая (⎣32767 / n ⎦ + 1 )из 32768 шансов. Значения n
, которые не являются множителями 32768, вносят смещение из-за неравномерного разделения диапазона возможных значений.