명령을 무작위로 실행하는 방법을 원합니다 (10 중 1 번). 이를 위해 내장 또는 GNU coreutil이 있습니까?
chance 10 && do_stuff
do_stuff
10 번 중 1 번만 어디에서 실행됩니까? 스크립트를 작성할 수는 있지만 상당히 간단한 것 같으며 정의 된 방법이 있는지 궁금합니다.
답변
에서 ksh
, 배쉬, zsh을, 야쉬 또는 비지 박스 sh
:
[ "$RANDOM" -lt 3277 ] && do_stuff
RANDOM
Korn, 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_stuff
never가되지 않습니다 do_stuff
.
이는을 사용하여“1 in n ” 에 대한 일반 공식을 사용 $RANDOM
하며, 이는 32768 확률 [[ $RANDOM -lt $((32767 / n + 1)) ]]
로 (⎣32767 / n ⎦ + 1)을 제공합니다. n
32768의 요소가 아닌 값은 가능한 값 범위에서 고르지 않은 분할로 인해 바이어스 를 유발합니다.
답변
비표준 솔루션 :
[ $(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 🙂