Skip to content

6. 랜덤한 정수 만들기


$RANDOM은 BASH 내부 함수로 0에서 32767 사이의 난수를 리턴한다. $RANDOM은 암호화 키를 발생시키는 데에는 쓸 수 없다.


#!/bin/bash

# $RANDOM은 불릴 때마다 다른 난수를 리턴함
# 0 ~ 32767 (16비트 양의 정수)
MAXCOUNT=5
count=1
echo "${MAXCOUNT}개의 랜덤한 숫자:"
echo "------------------------------"
while [ "$count" -le $MAXCOUNT ]; do
    number=$RANDOM
    echo $number
    let "count += 1"
done
echo "------------------------------"
# 5개의 랜덤한 숫자:
# ------------------------------
# 23460
# 6974
# 7782
# 10251
# 172
# ------------------------------

# 어떤 범위의 랜덤 값이 필요하다면
# 모듈로 연산을 사용함
RANGE=500
number=$RANDOM
let "number %= $RANGE"
echo "${RANGE}보다 작은 랜덤한 숫자 -> ${number}"
# 500보다 작은 랜덤한 숫자 -> 234

# 어떤 값보다 큰 랜덤 값이 필요하다면
# 그 값보다 작은 수는 무시함
FLOOR=200
number=0
while [ "$number" -le $FLOOR ]; do
    number=$RANDOM
done
echo "${FLOOR}보다 큰 랜덤한 숫자 -> ${number}"
# 200보다 큰 랜덤한 숫자 -> 11860

# 상한값과 하한값 사이의 랜덤 값이 필요하다면
# 위와 같이 테스트 문을 걸어 줌
number=0
while [ "$number" -le $FLOOR ]; do
    number=$RANDOM
    let "number %= $RANGE"
done
echo "${FLOOR}${RANGE} 사이의 랜덤한 숫자 -> ${number}"
# 200와 500 사이의 랜덤한 숫자 -> 318

# "참"이나 "거짓" 중에 하나를 고르도록 할 수 있음
BINARY=2
number=$RANDOM
T=1
let "number %= $BINARY"
# 또는 let "number >>= 14"로
# 마지막 두 비트를 제외하고 모두 오른쪽 시프트
if [ "$number" -eq $T ]; then
    echo "TRUE"
else
    echo "FALSE"
fi
# TRUE

# 주사위 던지기
SPOTS=7
DICE=2
ZERO=0
die1=0
die2=0

# 정확한 확률을 위해서 두 개의 주사위를 따로 던짐
while [ "$die1" -eq $ZERO ]; do
    let "die1 = $RANDOM % $SPOTS"
done
while [ "$die2" -eq $ZERO ]; do
    let "die2 = $RANDOM % $SPOTS"
done
let "throw = $die1 + $die2"
echo "die1 = ${die1} / die2 = ${die2}"
echo "두 주사위를 던진 결과 = ${throw}"
# die1 = 4 / die2 = 3
# 두 주사위를 던진 결과 = 7

exit 0
#!/bin/bash

# 스크립트의 PID를 써서 난수 발생기의 Seed를 다시 생성
RANDOM=$$

PIPS=6
MAXTHROWS=1000
throw=0

zeros=0
ones=0
twos=0
threes=0
fours=0
fives=0
sixs=0

print_result() {
    echo "ones = ${ones}"
    echo "twos = ${twos}"
    echo "threes = ${threes}"
    echo "fours = ${fours}"
    echo "fives = ${fives}"
    echo "sixs = ${sixs}"
}

update_count() {
    case "$1" in
    0) let "ones += 1" ;;
    1) let "twos += 1" ;;
    2) let "threes += 1" ;;
    3) let "fours += 1" ;;
    4) let "fives += 1" ;;
    5) let "sixs += 1" ;;
    esac
}

while [ "$throw" -lt "$MAXTHROWS" ]; do
    let "die1 = $RANDOM % $PIPS"
    update_count $die1
    let "throw += 1"
done

print_result
# ones = 161
# twos = 144
# threes = 174
# fours = 174
# fives = 182
# sixs = 165

# RANDOM이 정말 랜덤하다면 결과 분포는 고르게 나올 것임
# 주의할 것은 RANDOM이 의사난수 발생기이기 때문에
# 진짜로 랜덤한 것은 아님

exit 0
#!/bin/bash

MAXCOUNT=5

random_numbers() {
    count=0
    while [ "$count" -lt "$MAXCOUNT" ]; do
        number=$RANDOM
        echo -n "$number "
        let "count += 1"
    done
    echo
}

# 난수 발생긱에 Seed 세팅
RANDOM=1
random_numbers
# 16838 5758 10113 17515 31051

# 똑같은 Seed 사용
RANDOM=1
random_numbers
# 16838 5758 10113 17515 31051

# 다른 Seed 세팅
RANDOM=2
random_numbers
# 908 22817 10239 12914 25837

exit 0

References