내 스크립트는 $RANDOM을 사용할 때 동일한 출력을 생성합니다.

내 스크립트는 $RANDOM을 사용할 때 동일한 출력을 생성합니다.

n명령줄 자체에서 입력한 임의의 문자 단어를 인쇄하려고 하는데 n어떤 이유로 내 스크립트가 매번 동일한 값으로 동일한 대답을 제공합니다 n.

#!/bin/bash                                                                                                                                       
num=$1
egrep "^.{$num}$" /usr/share/dict/words | head -n $RANDOM| tail -n 1

나는 다음과 같이 스크립트를 호출합니다.

$ bash var3.sh 5
étude             # always the same output when using 5 

$ bash var3.sh 3
zoo               # always the same output when using 3

내 스크립트의 이름은 어디에 var3.sh있고 5는 무작위로 인쇄하려는 단어의 길이입니다.

정말로 임의의 단어를 인쇄하려면 어떻게 해야 합니까?

답변1

그러나 실제로는 그렇지 않습니다. 그러나 $RANDOM은 특히 제한된 길이의 단어에 대해 큰 숫자(0에서 32767 사이)를 반환하며 해당 부분이 grep의 모든 결과를 반환할 수 있는 것과 동일한 결과를 표시합니다 head(3의 경우 my 에 819개의 일치 항목만 있음 /usr/share/dict/words).

더 나은 해결책은 결과를 뒤섞는 것입니다.

egrep "^.{$num}$" /usr/share/dict/words | sort -R | tail -n 1

이는 (GNU 확장)을 -R의미합니다 .--random-sortsort

답변2

원하는 것을 인쇄하는 쉬운 방법일련번호-알파벳 단어의 사용 shuf:

egrep "^.{$num}$" /usr/share/dict | shuf -n1

shuf명령은 입력의 무작위 순열을 출력하며, 이 -n1플래그는 해당 결과의 첫 번째 항목만 출력하도록 지시합니다.

답변3

다른 사람들이 지적했듯이 코드의 주요 문제점은 $RANDOM종종 값이 특정 길이의 단어 수보다 훨씬 크다는 것입니다.

다음만 사용하세요 awk:

$ awk -v len="$num" 'length == len { word[i++]=$0 }
                     END { print word[int(i*rand())] }' /usr/share/dict/words
Bosniac

이 프로그램은 주어진 파일에서 특정 길이의 모든 라인을 읽습니다. 이것들은 배열에 저장됩니다 words.

마지막으로 이 배열에서 임의의 요소를 선택하고 인쇄합니다.

관련 정보