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

答え2

非標準ソリューション:

[ $(date +%1N) == 1 ] && do_stuff

現在時刻の最後のビット(ナノ秒)が1であることを確認してください!

答え3

代わりに使用できるコマンドは次$RANDOMのとおりです。shuf

[[ $(shuf -i 1-10 -n 1) == 1 ]] && do_stuff

仕事をします。たとえば、ファイル内の行をランダムに選択するのにも役立ちます。音楽プレイリスト用。

答え4

ランダム性が欲しいのか周期性が欲しいのかわかりません...周期性のために:

for i in `seq 1 10 100`; do echo $i;done
1
11
21
31
41
51
61
71
81
91

これを上記の「$RANDOM」トリックと混在させることで、次のように複雑なものを作成できます。

私のためにseq 1 1000 $RANDOM。 echo $i;

はあ:-)

関連情報