고유 번호 생성 RANDOM 함수 OS X

고유 번호 생성 RANDOM 함수 OS X

숫자 배열 목록을 기반으로 무작위 생성기를 만들고 있습니다. 하지만 난수를 다시 사용할 수 없도록 고유하게 만들고 싶습니다. 나는'사용된'현재 무작위로 생성된 숫자를 저장한 다음 다른 난수를 생성하고 루프를 반복하는 배열 목록'사용된'배열 목록을 작성하고 이미 사용되었는지 확인하십시오. 있는 경우 사용되지 않은 번호가 있을 때까지 계속 생성합니다.

이것이 내가 지금까지 가지고 있는 것입니다.

generate.sh

#!/bin/bash

USED[0]=""
USED[1]=""
USED[2]=""
USED[3]=""
USED[4]=""
USED[5]=""
USED[6]=""
USED[7]=""
USED[8]=""
USED[9]=""

NUMBER[0]="1"
NUMBER[1]="2"
NUMBER[2]="3"
NUMBER[3]="4"
NUMBER[4]="5"
NUMBER[5]="6"
NUMBER[6]="7"
NUMBER[7]="8"
NUMBER[8]="9"
NUMBER[9]="0"

for i in "${NUMBER[@]}"; do
 let RANDNUMBER=$RANDOM%10
 for j in "${USED[@]}"; do
  if [ $j -eq $RANDOMNUMBER ]; then
   let RANDNUMBER=$RANDOM%10
  else
   echo ${NUMBER[$RANDNUMBER]} >> generated.txt
  fi
 done
done

스크립트를 실행하면 오류가 없지만 아무 것도 출력되지 않습니다.생성된.txt파일이 비어 있습니다.

내가 놓친 것이 있나요? 여러분이 도와주셨으면 좋겠습니다 :) 미리 감사드립니다.

답변1

목록을 섞는 일반적인 방법은 요소를 반복하는 것입니다.교환다른 요소와 무작위로.

#! /bin/bash -
list=(1 2 3 4 5 6 7 8 9 0)
random_list=("${list[@]}")
n=${#random_list[@]}
for ((i = 0; i < n; i++)); do
  (( r = RANDOM % n ))
  tmp=${random_list[i]}
  random_list[i]=${random_list[r]}
  random_list[r]=$tmp
done
printf '%s\n' "${random_list[@]}" > generated.txt

FreeBSD에는 무작위 정렬 옵션이 sort있는데 -R, OS/X가 정렬하지 않으면 놀랄 것입니다. 따라서 다음과 같이 할 수 있습니다(배열 요소에 개행 문자가 포함되어 있지 않다고 가정).

printf '%s\n' "${list[@]}" | sort -R > generated.txt

답변2

두 가지 오타:

[ $j -eq $RANDOMNUMBER ]~해야 한다[[ $j -eq $RANDNUMBER ]]

수정이 효과가 있는 것 같습니다.

관련 정보