Bash에서 N 중 1 번 명령을 실행하는 방법 무작위로 실행하는 방법을

명령을 무작위로 실행하는 방법을 원합니다 (10 중 1 번). 이를 위해 내장 또는 GNU coreutil이 있습니까?

chance 10 && do_stuff

do_stuff10 번 중 1 번만 어디에서 실행됩니까? 스크립트를 작성할 수는 있지만 상당히 간단한 것 같으며 정의 된 방법이 있는지 궁금합니다.



답변

에서 ksh, 배쉬, zsh을, 야쉬 또는 비지 박스 sh:

[ "$RANDOM" -lt 3277 ] && do_stuff

RANDOMKorn, Bash, Yash, Z 및 BusyBox 쉘 의 특수 변수는 평가 될 때마다 0에서 32767 사이의 의사 난수 십진 정수 값을 생성하므로 위의 확률은 10 분의 1입니다.

이것을 사용하여 적어도 Bash에서 질문에 설명 된대로 작동하는 함수를 생성 할 수 있습니다.

function chance {
  [[ -z $1 || $1 -le 0 ]] && return 1
  [[ $RANDOM -lt $((32767 / $1 + 1)) ]]
}

인수를 제공하지 않거나 유효하지 않은 인수를 제공하면 1의 결과가 생성되므로 chance && do_stuffnever가되지 않습니다 do_stuff.

이는을 사용하여“1 in n ” 에 대한 일반 공식을 사용 $RANDOM하며, 이는 32768 확률 [[ $RANDOM -lt $((32767 / n + 1)) ]]로 (⎣32767 / n ⎦ + 1)을 제공합니다. n32768의 요소가 아닌 값은 가능한 값 범위에서 고르지 않은 분할로 인해 바이어스 를 유발합니다.


답변

비표준 솔루션 :

[ $(date +%1N) == 1 ] && do_stuff

현재 시간의 마지막 자릿수가 나노초인지 확인하십시오!


답변

사용에 대한 대안 $RANDOM은 다음 shuf명령입니다.

[[ $(shuf -i 1-10 -n 1) == 1 ]] && do_stuff

일을 할 것입니다. 예를 들어 파일에서 라인을 무작위로 선택할 때도 유용합니다. 음악 재생 목록 용.


답변

첫 번째 답변을 개선하고 달성하려는 목표를 훨씬 더 명확하게 만듭니다.

[ $(( $RANDOM % 10 )) == 0 ] && echo "You win" || echo "You lose"


답변

무작위 또는 주기성을 원하는지 확실하지 않습니다 … 주기성을 위해 :

for i in `seq 1 10 100`; do echo $i;done
1
11
21
31
41
51
61
71
81
91

예를 들어 위의 “$ RANDOM”트릭과 혼합하여 더 혼란스러운 것을 만들 수 있습니다.

i의 경우 seq 1 1000 $RANDOM; 메아리 $ i; 완료

HTH 🙂


답변