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

목록을 카드 한 벌로 생각하십시오. 셔플 재생숫자를 하나씩 읽어보세요.

바라보다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

관련 정보