「持続的なランダム性」を達成する方法は?

「持続的なランダム性」を達成する方法は?

RANDOM%x一連の個々の結果を取得します。

次のシナリオを実装する方法は? :forループでは、bashスクリプトはすべてのループの33.33%でコマンドAを実行し、そうでない場合はコマンドB(66.66%)を実行したいと思います。

答え1

あなたは使うRANDOM % x、あなたが言ったように。

if [[ $((RANDOM % 3)) == 0 ]]
then
    A
else
    B
fi

モジュロ 3 の値は、その時間の 1/3 の間ゼロで、次にコマンド A を実行します。残りの時間にはBコマンドを実行します。

答え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

関連情報