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