RANDOM%x
一連の個々の結果を取得します。
次のシナリオを実装する方法は? :forループでは、bashスクリプトはすべてのループの33.33%でコマンドAを実行し、そうでない場合はコマンドB(66.66%)を実行したいと思います。
答え1
答え2
たとえば、疑似乱数ジェネレータ (prng) から 10 進数の乱数を取得するには、次のようにします。
dd bs=1 count=1 if=/dev/urandom 2>/dev/null|od -i|awk '{print $2}'
Michaelが提案したように、この数字にモジュロ3を使用することも、単に使用することもできます。
let b=`dd bs=1 count=1 if=/dev/urandom 2>/dev/null|od -i|awk '{print $2}'`
if [ $b -ge 85 ]
then B
else A
fi
これは 33.33% <85 で 66.66% >= 85 なので、85 から分岐します。
私が使ったようにdc
(ポーランド語の逆表記計算機)とにかく、もちろんモジュラスを使うこともできます。
let b=`dd bs=1 count=1 if=/dev/urandom 2>/dev/null|od -t u1|awk '{print $2" 3%pq"}'|dc`
if [ $b -eq 0 ]
then A
else B
fi
答え3
目的の33%と66%の結果を得るために乱数を使用しないでください。
他の人が前述したようにカウンターを増やし、モジュロ3を使用してください。
#!/bin/bash
count=0 ca=0 cb=0
while ((count++)); ((count <100)); do
if [[ $(($count % 3)) == 0 ]]
then
((ca++))
else
((cb++))
fi
done
printf "count of ca: %d\ncount of cb: %d" ${ca} ${cb}
その結果は次のとおりです。
count of ca: 33
count of cb: 66
ランダムジェネレータを使用する場合、結果は予期しない結果です(33%対66%ではありません)。
#with a changed if statement:
#if [[ $(($RANDOM % 3)) == 0 ]]
#the results of three runs are:
count of ca: 31
count of cb: 68
count of ca: 27
count of cb: 72
count of ca: 44
count of cb: 55