コマンドをランダムに、たとえば10回に1回実行する方法が必要です。これを行うための組み込みまたはGNU coreutil、理想的には次のようなものがありますか?
chance 10 && do_stuff
どこ do_stuff
は10回に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
_になることはありません。
これは、[[ $RANDOM -lt $((32767 / n + 1)) ]]
である_$RANDOM
_を使用して「1 in n」の一般式を使用し、(⎣32767/ n⎦ + 1)32768の確率で。 32768の因数ではないn
の値は、可能な値の範囲の不均一な分割のためにバイアスを導入します。
非標準のソリューション:
[ $(date +%1N) == 1 ] && do_stuff
ナノ秒単位の現在時刻の最後の桁が1かどうかを確認してください!
$RANDOM
を使用する代わりに、shuf
コマンドを使用できます。
[[ $(shuf -i 1-10 -n 1) == 1 ]] && do_stuff
仕事をします。ファイルから行をランダムに選択する場合にも便利です。音楽プレイリスト用。
最初の答えを改善し、達成しようとしていることをより明確にする:
[ $(( $RANDOM % 10 )) == 0 ] && echo "You win" || echo "You lose"
ランダム性と周期性のどちらが必要かはわかりません...周期性の場合:
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 :-)