Bash:ランダムなリストで重複した結果を回避するには?

Bash:ランダムなリストで重複した結果を回避するには?

このようなスクリプトがあるとしましょう。

#!/bin/bash
array[0]="123"
array[1]="333"
array[2]="5566"
array[3]="135"
array[4]="68"
array[5]="45"
array[6]="78"
array[7]="32"
array[8]="190"

number()
{
size=${#array[@]}
index=$(($RANDOM % $size))
sleep 0.5s
echo  Lucky number is ... ${array[$index]}
}

for i in {1..21}; do number; done

わかりました..間隔で任意の数字を取得したいのですが、重複した数字もたくさん表示したいと思います。

Lucky number is ... 135
Lucky number is ... 135
Lucky number is ... 5566
Lucky number is ... 78
Lucky number is ... 190
Lucky number is ... 333
Lucky number is ... 190
Lucky number is ... 135
Lucky number is ... 5566
Lucky number is ... 333
Lucky number is ... 45
Lucky number is ... 45
Lucky number is ... 68
Lucky number is ... 68
Lucky number is ... 333
Lucky number is ... 78
Lucky number is ... 78
Lucky number is ... 5566
Lucky number is ... 78
Lucky number is ... 333
Lucky number is ... 135

私はこの結果が欲しい

Lucky number is ... 135
Lucky number is ... 5566
Lucky number is ... 78
Lucky number is ... 190
Lucky number is ... 333
Lucky number is ... 45
Lucky number is ... 68

このように、私たちは繰り返さずに「幸運の数」を得ることができます。唯一の方法を知っている人はいますか?スクリプトを編集し、21個を9個に減らしました。変更はなく、重複した項目もあります。

Lucky number is ... 135
Lucky number is ... 68
Lucky number is ... 45
Lucky number is ... 333
Lucky number is ... 78
Lucky number is ... 135
Lucky number is ... 135
Lucky number is ... 333
Lucky number is ... 32

ベストアンサー1

リストを一枚のカードと考えてください。 シャッフル再生数字を1つずつ読んでください。

バラよりBASHシェルで配列要素を混在させる簡単な方法は何ですか?

#!/bin/bash
array=("123" "333" "5566" "135" "68" "45" "78" "32" "190")

shuffle() {
    array=($(shuf -e "${array[@]}"))
    index=0
}

number() {
   size=${#array[@]}
   sleep 0.5s

   if (( index >= size )) ; then
      shuffle
   fi

   echo Lucky number is ... ${array[$index]}
   index=$((index + 1))
}

for i in {1..21}; do number; done

おすすめ記事