10번 중 1번처럼 무작위로 명령을 실행하는 방법을 원합니다. 이 작업을 수행할 수 있는 내장 또는 GNU coreutil이 있습니까? 바람직하게는 다음과 같습니다.
chance 10 && do_stuff
do_stuff
10분의 1만 시행되는 곳은 어디입니까 ? 스크립트를 작성할 수 있다는 것을 알고 있지만 이것은 상당히 간단한 것처럼 보이며 정의된 방법이 있는지 알고 싶습니다.
답변1
ksh
Bash, Zsh, Yash 또는 BusyBox 에서 sh
:
[ "$RANDOM" -lt 3277 ] && do_stuff
Korn, Bash, Yash, Z 및 BusyBox 쉘의 특수 변수는 RANDOM
평가될 때마다 0에서 32767 사이의 의사 난수 십진 정수 값을 생성하므로 위의 경우 확률은 1/10입니다.
이것을 사용하여 적어도 Bash에서 질문에 설명된 대로 작동하는 함수를 생성할 수 있습니다.
function chance {
[[ -z $1 || $1 -le 0 ]] && return 1
[[ $RANDOM -lt $((32767 / $1 + 1)) ]]
}
인수 제공을 잊어버리거나 유효하지 않은 인수를 제공하면 결과 1이 생성되므로 chance && do_stuff
절대로 do_stuff
.
이것은 "1 inN” 를 사용하여 $RANDOM
, 즉 [[ $RANDOM -lt $((32767 / n + 1)) ]]
, 주어진 (⎣32767 /N⎦ + 1) 32768개의 기회. n
32768 인수 이외의 값은 가능한 값의 범위가 고르지 않게 나누어져 있기 때문에 편향이 발생합니다.
답변2
비표준 솔루션:
[ $(date +%1N) == 1 ] && do_stuff
현재 시간의 마지막 비트(나노초)가 1인지 확인하세요!
답변3
대안으로 사용할 수 있는 명령 은 다음 $RANDOM
과 같습니다 .shuf
[[ $(shuf -i 1-10 -n 1) == 1 ]] && do_stuff
일을 할 것입니다. 예를 들어, 파일에서 행을 무작위로 선택하는 데에도 유용합니다. 음악 재생 목록용.
답변4
무작위성을 원하는지 주기성을 원하는지 잘 모르겠습니다... 주기성을 위해:
for i in `seq 1 10 100`; do echo $i;done
1
11
21
31
41
51
61
71
81
91
이것을 위의 "$RANDOM" 트릭과 혼합하여 다음과 같이 더 복잡한 것을 생성할 수 있습니다.
나를 위해 seq 1 1000 $RANDOM
; echo $i;
하아:-)