RANDOM%x
일련의 개별 결과를 얻습니다 .
다음 시나리오를 구현하는 방법은 무엇입니까? : for 루프에서 bash 스크립트가 모든 루프의 33.33%에서 명령 A를 실행하고 그렇지 않으면 명령 B(66.66%)를 실행하기를 원합니다.
답변1
답변2
예를 들어, 의사 난수 생성기(prng)에서 십진수 난수를 얻으려면 다음을 사용할 수 있습니다.
dd bs=1 count=1 if=/dev/urandom 2>/dev/null|od -i|awk '{print $2}'
Michael이 제안한 대로 이 숫자에 모듈로 3을 사용할 수도 있고 그냥 사용할 수도 있습니다.
let b=`dd bs=1 count=1 if=/dev/urandom 2>/dev/null|od -i|awk '{print $2}'`
if [ $b -ge 85 ]
then B
else A
fi
이렇게 하면 33.33% <85이고 66.66% >= 85이므로 85에서 분기됩니다.
내가 사용한 것처럼 dc
(폴란드어 역 표기법 계산기) 어쨌든, 물론 모듈러스를 사용할 수도 있습니다.
let b=`dd bs=1 count=1 if=/dev/urandom 2>/dev/null|od -t u1|awk '{print $2" 3%pq"}'|dc`
if [ $b -eq 0 ]
then A
else B
fi
답변3
원하는 33% 및 66% 결과를 얻기 위해 난수를 사용해서는 안 됩니다.
다른 사람들이 이전에 언급한 것처럼 카운터를 늘리고 모듈로 3을 사용하십시오.
#!/bin/bash
count=0 ca=0 cb=0
while ((count++)); ((count <100)); do
if [[ $(($count % 3)) == 0 ]]
then
((ca++))
else
((cb++))
fi
done
printf "count of ca: %d\ncount of cb: %d" ${ca} ${cb}
그 결과는 다음과 같습니다.
count of ca: 33
count of cb: 66
무작위 생성기를 사용할 때 결과는 예상치 못한 결과입니다(33% 대 66% 아님).
#with a changed if statement:
#if [[ $(($RANDOM % 3)) == 0 ]]
#the results of three runs are:
count of ca: 31
count of cb: 68
count of ca: 27
count of cb: 72
count of ca: 44
count of cb: 55