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