web-dev-qa-db-ja.com

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

コマンドをランダムに、たとえば10回に1回実行する方法が必要です。これを行うための組み込みまたはGNU coreutil、理想的には次のようなものがありますか?

chance 10 && do_stuff

どこ do_stuffは10回に1回だけ実行されますか?私はスクリプトを書くことができることを知っていますが、それはかなり単純なもののようであり、定義された方法があるかどうか疑問に思っていました。

15
retnikt

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_になることはありません。

これは、[[ $RANDOM -lt $((32767 / n + 1)) ]]である_$RANDOM_を使用して「1 in n」の一般式を使用し、(⎣32767/ n⎦ + 1)32768の確率で。 32768の因数ではないnの値は、可能な値の範囲の不均一な分割のためにバイアスを導入します。

40
Stephen Kitt

非標準のソリューション:

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

ナノ秒単位の現在時刻の最後の桁が1かどうかを確認してください!

25
stackzebra

$RANDOMを使用する代わりに、shufコマンドを使用できます。

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

仕事をします。ファイルから行をランダムに選択する場合にも便利です。音楽プレイリスト用。

21
seumasmac

最初の答えを改善し、達成しようとしていることをより明確にする:

[ $(( $RANDOM % 10 )) == 0 ] && echo "You win" || echo "You lose"
12
Eisenknurr

ランダム性と周期性のどちらが必要かはわかりません...周期性の場合:

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

たとえば、上記の "$ RANDOM"トリックと組み合わせて、より混沌としたものを作成できます。

for i in seq 1 1000 $RANDOM;エコー$ i;完了

HTH :-)

1
Dr_ST