シェルでおみくじファンクション


(20)
引数: コロン区切りの発生比率
戻り値: 該当インデックス番号(1始まり)

function func1
{
    param1=$1
    ar1=()
    ret=0

    # 要素数をカウント
    item_cnt=$(echo "${param1}" |awk -F':' '{print NF}')

    # 要素数だけ繰り返し、発生確率を配列に格納
    prob_sum=0
    for i in $(seq 1 ${item_cnt});do 
        item=$(echo "${param1}" |awk -v i=${i} -F':' '{print $i}')
        ar1=("${ar1[@]}" ${item} )
        prob_sum=$(( ${prob_sum}+${item} ))
    done

    # 0~100の乱数を生成し、該当するインデックス番号を求める
    ransu=$(awk 'BEGIN{ srand('"$RANDOM"'); print int(rand() * 100) }')

    bunsi_from=0
    bunsi_to=0
    for e in ${!ar1[@]}; do
        bunsi_to=$(( ${bunsi_to}+${ar1[$e]} ))
        if [ $((${bunsi_from}*100)) -le $((${ransu}*${prob_sum})) ] && [  $((${ransu}*${prob_sum})) -lt $((${bunsi_to}*100)) ]; then
            ret=$(( $e+1 ))
            break
        fi
        bunsi_from=${bunsi_to}
    done
    echo $ret
}

 


# 動作確認
ファンクションを1000回実行し、指定した発生確率となっていることを確認

i1=0
i2=0
i3=0
i4=0
i5=0

for i in $(seq 1 1000); do
    ret=$(func1 "1:2:3:4:5")
    case "${ret}" in
        "1") i1=$((${i1}+1)) ;;
        "2") i2=$((${i2}+1)) ;;
        "3") i3=$((${i3}+1)) ;;
        "4") i4=$((${i4}+1)) ;;
        "5") i5=$((${i5}+1)) ;;
    esac
done

echo ${i1}
echo ${i2}
echo ${i3}
echo ${i4}
echo ${i5}

 


(10)
引数: コロン区切りの発生比率
戻り値: 該当インデックス番号(1始まり)

function func1
{
    param1=$1
    ar1=()
    ret=0

    # 要素数をカウント
    item_cnt=$(echo "${param1}" |awk -F':' '{print NF}')

    # 要素数だけ繰り返し、発生確率を配列に格納
    prob_sum=0
    for i in $(seq 1 ${item_cnt});do 
        item=$(echo "${param1}" |awk -v i=${i} -F':' '{print $i}')
        ar1=("${ar1[@]}" ${item} )
        prob_sum=$(( ${prob_sum}+${item} ))
    done

    # 0~100の乱数を生成し、該当するインデックス番号を求める
    ransu=$(awk 'BEGIN{ srand('"$RANDOM"'); print int(rand() * 100) }')

    bunsi_from=0
    bunsi_to=0
    for e in ${!ar1[@]}; do
        bunsi_to=$(( ${bunsi_to}+${ar1[$e]} ))
        if [ $((${bunsi_from}*100)) -le $((${ransu}*${prob_sum})) ] && [  $((${ransu}*${prob_sum})) -lt $((${bunsi_to}*100)) ]; then
            ret=$(( $e+1 ))
            break
        fi
        bunsi_from=${bunsi_to}
    done
    echo $ret
}

 


# 動作確認
ファンクションを1000回実行し、指定した発生確率となっていることを確認

i1=0
i2=0
i3=0
i4=0
i5=0

for i in $(seq 1 1000); do
    ret=$(func1 "1:2:3:4:5")
    case "${ret}" in
        "1") i1=$((${i1}+1)) ;;
        "2") i2=$((${i2}+1)) ;;
        "3") i3=$((${i3}+1)) ;;
        "4") i4=$((${i4}+1)) ;;
        "5") i5=$((${i5}+1)) ;;
    esac
done

echo ${i1}
echo ${i2}
echo ${i3}
echo ${i4}
echo ${i5}

 


(8)

引数: コロン区切りの発生比率
戻り値: 該当インデックス番号(1始まり)

function func1
{
    param1=$1
    ar1=()
    ret=0

    # 要素数をカウント
    item_cnt=$(echo "${param1}" |awk -F':' '{print NF}')

    # 要素数だけ繰り返し、発生確率を配列に格納
    prob_sum=0
    for i in $(seq 1 ${item_cnt});do 
        item=$(echo "${param1}" |awk -v i=${i} -F':' '{print $i}')
        ar1=("${ar1[@]}" ${item} )
        prob_sum=$(( ${prob_sum}+${item} ))
    done

    # 0~100の乱数を生成し、該当するインデックス番号を求める
    ransu=$(awk 'BEGIN{ srand('"$RANDOM"'); print int(rand() * 100) }')

    bunsi_from=0
    bunsi_to=0
    for e in ${!ar1[@]}; do
        bunsi_to=$(( ${bunsi_to}+${ar1[$e]} ))
        if [ $((${bunsi_from}*100)) -le $((${ransu}*${prob_sum})) ] && [  $((${ransu}*${prob_sum})) -lt $((${bunsi_to}*100)) ]; then
            ret=$(( $e+1 ))
            break
        fi
        bunsi_from=${bunsi_to}
    done
    echo $ret
}

 


# 動作確認
ファンクションを1000回実行し、指定した発生確率となっていることを確認

i1=0
i2=0
i3=0
i4=0
i5=0

for i in $(seq 1 1000); do
    ret=$(func1 "1:2:3:4:5")
    case "${ret}" in
        "1") i1=$((${i1}+1)) ;;
        "2") i2=$((${i2}+1)) ;;
        "3") i3=$((${i3}+1)) ;;
        "4") i4=$((${i4}+1)) ;;
        "5") i5=$((${i5}+1)) ;;
    esac
done

echo ${i1}
echo ${i2}
echo ${i3}
echo ${i4}
echo ${i5}

 


(2019)


引数: コロン区切りの発生比率
戻り値: 該当インデックス番号(1始まり)

 

function func1 ($param1){
    $ar1 = @()
    $ret = 0

    # 要素数をカウント
    $item_cnt = $param1.length - $param1.replace(":","").length +1

    # 発生確率を配列に格納
    $ar1 =$param1.split(":")
    
    $prob_sum = 0
    foreach($e in $ar1){
        $prob_sum = $prob_sum + $e
    }

    # 0~100の乱数を生成し、該当するインデックス番号を求める
    $ransu = Get-Random -Maximum 100

    $bunsi_from = 0
    $bunsi_to = 0
    for ( $e = 0; $e -lt $ar1.count; $e++){
        $bunsi_to = $bunsi_to + $ar1[$e]
        if ( ($bunsi_from * 100 -le $ransu * $prob_sum)  -and ($ransu * $prob_sum -lt $bunsi_to * 100) ) {
            $ret = $e+1
            break
        }
        $bunsi_from = $bunsi_to
    }
    return $ret
}

 


# 動作確認
ファンクションを1000回実行し、指定した発生確率となっていることを確認

$i1 = 0
$i2 = 0
$i3 = 0
$i4 = 0
$i5 = 0

for ( $i = 0; $i -le 1000; $i++){
    $ret = func1 "1:2:3:4:5"
    switch($ret){
        "1" {$i1 = $i1 + 1}
        "2" {$i2 = $i2 + 1}
        "3" {$i3 = $i3 + 1}
        "4" {$i4 = $i4 + 1}
        "5" {$i5 = $i5 + 1}
    }
}

Write-Host $i1
Write-Host $i2
Write-Host $i3
Write-Host $i4
Write-Host $i5