"지속적인 무작위성"을 달성하는 방법은 무엇입니까?

"지속적인 무작위성"을 달성하는 방법은 무엇입니까?

RANDOM%x일련의 개별 결과를 얻습니다 .

다음 시나리오를 구현하는 방법은 무엇입니까? : for 루프에서 bash 스크립트가 모든 루프의 33.33%에서 명령 A를 실행하고 그렇지 않으면 명령 B(66.66%)를 실행하기를 원합니다.

답변1

너는 사용한다RANDOM % x, 당신이 말한 것처럼요.

if [[ $((RANDOM % 3)) == 0 ]]
then
    A
else
    B
fi

모듈로 3 값은 해당 시간의 1/3 동안 0이고 그런 다음 명령 A를 실행합니다. 나머지 시간에는 B 명령을 실행합니다.

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

관련 정보