명령을 무작위로 실행하는 방법을 원합니다 (10 중 1 번). 이를 위해 내장 또는 GNU coreutil이 있습니까?
chance 10 && do_stuff
do_stuff
10 번 중 1 번만 어디에서 실행됩니까? 스크립트를 작성할 수는 있지만 상당히 간단한 것 같으며 정의 된 방법이 있는지 궁금합니다.
명령을 무작위로 실행하는 방법을 원합니다 (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의 요소가 아닌 값은 가능한 값 범위에서 고르지 않은 분할로 인해 바이어스 를 유발합니다.
$((32767/parts+1))
가 1보다 커야하거나 1의 부품 수가 증가하는 반면 분할 결과 (및 한계)는 동일해야합니다. (계속)
(32767/n-32767/(n+1))>=1
은 ~ 181.5에서 한계를 제공하는 n을 푸는 것입니다. 실제로 부품 수는 문제없이 194 개까지 늘어날 수 있습니다. 그러나 195 개 부품에서 결과 한계는 151 개이며 194 개 부품과 동일한 결과입니다. 그것은 부적절하며 피해야합니다. 요컨대, 부품 수 (n)의 상한은 194 여야합니다. 한계 테스트를 수행 할 수 있습니다.[[ -z $1 || $1 -le 1 || $1 -ge 194 ]] && return 1
비표준 솔루션 :
[ $(date +%1N) == 1 ] && do_stuff
현재 시간의 마지막 자릿수가 나노초인지 확인하십시오!
[ $(date +%1N) == 1 ] && do_stuff
규칙적인 간격으로 호출 이 발생하지 않도록 해야합니다. 그렇지 않으면 임의성이 손상됩니다. while true; do [ $(date +1%N) == 1 ] && sleep 1; done
추상적 인 반례로 생각하십시오 . 그럼에도 불구하고, 나노초를 가지고 노는 아이디어는 정말 좋습니다. 그래서 나는 그것을 사용할 것이라고 생각합니다. 따라서 +1
clock_getres()
). (클럭이 올바른 경우에도 바이어스가 발생 함), 3) 임의의 값을 얻는 지원되는 방법은 (보통) /dev/urandom
의 값을 읽 거나 검사하는 것입니다 $RANDOM
.
사용에 대한 대안 $RANDOM
은 다음 shuf
명령입니다.
[[ $(shuf -i 1-10 -n 1) == 1 ]] && do_stuff
일을 할 것입니다. 예를 들어 파일에서 라인을 무작위로 선택할 때도 유용합니다. 음악 재생 목록 용.
첫 번째 답변을 개선하고 달성하려는 목표를 훨씬 더 명확하게 만듭니다.
[ $(( $RANDOM % 10 )) == 0 ] && echo "You win" || echo "You lose"
$RANDOM % 10
$RANDOM
정확히 10 개의 다른 값의 배수 (일반적으로 이진 컴퓨터에서는 발생하지 않음)를 생성 하지 않는 한 편향이 있습니다.
"$RANDOM" -lt $((32767 / n + 1))
.