In ksh
, Bash, Zsh, Yash oder BusyBox sh
:
[ "$RANDOM" -lt 3277 ] && do_stuff
Die RANDOM
Sondervariable der Korn-, Bash-, Yash-, Z- und BusyBox-Shells erzeugt bei jeder Auswertung einen pseudozufälligen dezimalen Integer-Wert zwischen 0 und 32767, sodass die obige Option eine Eins-zu-Zehn-Chance ergibt.
Sie können dies verwenden, um eine Funktion zu erzeugen, die sich wie in Ihrer Frage beschrieben verhält, zumindest in Bash:
function chance {
[[ -z $1 || $1 -le 0 ]] && return 1
[[ $RANDOM -lt $((32767 / $1 + 1)) ]]
}
Das Vergessen, ein Argument oder ein ungültiges Argument anzugeben, führt zu einem Ergebnis von 1, also chance && do_stuff
niemals do_stuff
.
Hierbei wird die allgemeine Formel für "1 in n " verwendet $RANDOM
, [[ $RANDOM -lt $((32767 / n + 1)) ]]
wobei 32768 eine Chance von (⎣32767 / n ⎦ + 1) ergibt. Werte, bei n
denen es sich nicht um Faktoren von 32768 handelt, führen aufgrund der ungleichmäßigen Aufteilung des Bereichs möglicher Werte zu einer Verzerrung.