10番のうち1番のようにランダムにコマンドを実行する方法が欲しいです。これを行うことができる組み込みまたはGNU coreutilはありますか?好ましくは以下の通りである。
chance 10 && do_stuff
do_stuff
10分の1だけ施行されるのはどこですか?スクリプトを書くことができることを知っていますが、これはかなり単純なように見え、定義された方法があるかどうかを知りたいです。
ベストアンサー1
ksh
Bash、Zsh、Yash、またはBusyBoxからsh
:
[ "$RANDOM" -lt 3277 ] && do_stuff
Korn、Bash、Yash、Z、およびBusyBoxシェルの特殊変数は、RANDOM
評価されるたびに0から32767の間の疑似乱数10進整数値を生成するため、上記の場合の確率は1/10です。
これを使用して、少なくともBashで質問で説明されているように機能する関数を生成できます。
function chance {
[[ -z $1 || $1 -le 0 ]] && return 1
[[ $RANDOM -lt $((32767 / $1 + 1)) ]]
}
引数の提供を忘れたり、無効な引数を提供したりすると結果1が生成されるので、chance && do_stuff
絶対にdo_stuff
。
これは「1 inN”を使用して$RANDOM
、つまり[[ $RANDOM -lt $((32767 / n + 1)) ]]
、与えられた(⎣32767 /N⎦+ 1)32768の機会。n
32768引数以外の値は、可能な値の範囲が不均一に分割されているため、偏りが発生します。