ランダム(乱数)で処理を実行するシェルコマンド
以下の3つはいずれも
処理echo "hello"
を1/3の確率(33%)で実行できます。
[ $(($RANDOM % 3)) -eq 1 ] && echo "hello"
[ $(($RANDOM % 100)) -lt 33 ] && echo "hello"
if [ $(($RANDOM % 100)) -lt 33 ]; then echo "hello" ; fi
1つずつ紐解いてみます。
$RANDOM とは
bash、zshであらかじめ用意されている環境変数で、
0
から32767
までの数字をランダム(乱数)出力させることが出来るようです。
試してみる
$ echo $RANDOM
26634
$ echo $RANDOM
7712
$ echo $RANDOM
15559
乱数を割った余りを出力する
乱数を割った余りを出します。
% 5
とすれば、乱数を5で割った余り、すなわち0-4までの数字がランダムに出ます。
$ echo $(($RANDOM % 5))
2
$ echo $(($RANDOM % 5))
4
なおexprを使う方法もありますが、二重括弧((...))
の方が処理が早いようです。
$ echo `expr $RANDOM % 5`
3
乱数を使った様々なパターン
eq(イコール)を用いたケース
乱数を割った余りの数字
と1
がイコール(eq)
だった場合に実行されます。
[ $(($RANDOM % 3)) -eq 1 ] && echo "hello" // 3回に1回
[ $(($RANDOM % 5)) -eq 1 ] && echo "hello" // 5回に1回
[ $(($RANDOM % 10)) -eq 1 ] && echo "hello" //10回に1回
[ $(($RANDOM % 100)) -eq 1 ] && echo "hello" //100回に1回
lt(より小さい)を用いたケース
乱数を割った余りの数字
が指定した数字
より小さい(lt)
場合に実行されます。
[ $(($RANDOM % 100)) -lt 33 ] && echo "hello" // 33%
[ $(($RANDOM % 100)) -lt 50 ] && echo "hello" // 50%
[ $(($RANDOM % 1000)) -lt 70 ] && echo "hello" // 7%
[ $(($RANDOM % 1000)) -lt 700 ] && echo "hello" // 70%
if文を用いてスクリプトも可能
if [ $(($RANDOM % 100)) -lt 33 ]; then echo "hello" ; fi
cronをランダム(乱数)に設定する
必須コマンド
登録
$ crontab -e
ファイルがあれば、crontab ファイル名
でも可能です。
確認
$ crontab -l
cronをランダムに実行させる設定例
分 時 日 月 曜日
# 5分おきに実行。ただし33%の確率
*/5 * * * * [ $(($RANDOM % 100)) -lt 33 ] && echo "hello"
# 1,6,11,16..5分おきに実行。ただし33%の確率
01-59/5 * * * * [ $(($RANDOM % 100)) -lt 33 ] && echo "hello"
# 2,7,12,17..5分おきに実行。ただし33%の確率
02-59/5 * * * * [ $(($RANDOM % 100)) -lt 33 ] && echo "hello"
# 8:00と16:00と20:00に実行。ただし50%の確率
0 8,16,20 * * * [ $(($RANDOM % 100)) -lt 50 ] && echo "hello"
# 12:30,13:30,14:30,16:30,,,に実行。ただし80%の確率
30 12,13,14-22/2 * * * [ $(($RANDOM % 100)) -lt 80 ] && echo "hello"
Reference
今回調べるにあたり多くの記事を見ました。
特に下記の記事を参考にさせて頂きました。
・シェルスクリプトでランダムにする方法
・exprと二重括弧について
・cronの実行時間の微調整1
・cronの実行時間の微調整2
・cron1時間に1回をワンライナー
・cronの設定例
・cronの書き方
いずれの記事も大変わかりやすくとても参考になる内容でした。
ありがとうございました。