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

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

10번 중 1번처럼 무작위로 명령을 실행하는 방법을 원합니다. 이 작업을 수행할 수 있는 내장 또는 GNU coreutil이 있습니까? 바람직하게는 다음과 같습니다.

chance 10 && do_stuff

do_stuff10분의 1만 시행되는 곳은 어디입니까 ? 스크립트를 작성할 수 있다는 것을 알고 있지만 이것은 상당히 간단한 것처럼 보이며 정의된 방법이 있는지 알고 싶습니다.

답변1

kshBash, 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개의 기회. n32768 인수 이외의 값은 가능한 값의 범위가 고르지 않게 나누어져 있기 때문에 편향이 발생합니다.

답변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;

하아:-)

관련 정보