BashでN回のうち1回のコマンドを実行する方法

BashでN回のうち1回のコマンドを実行する方法

10番のうち1番のようにランダムにコマンドを実行する方法が欲しいです。これを行うことができる組み込みまたはGNU coreutilはありますか?好ましくは以下の通りである。

chance 10 && do_stuff

do_stuff10分の1だけ施行されるのはどこですか?スクリプトを書くことができることを知っていますが、これはかなり単純なように見え、定義された方法があるかどうかを知りたいです。

ベストアンサー1

kshBash、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の機会。n32768引数以外の値は、可能な値の範囲が不均一に分割されているため、偏りが発生します。

おすすめ記事