| °í±Þ Bash ½ºÅ©¸³ÆÃ °¡À̵å: Bash¸¦ ÀÌ¿ëÇÑ ½© ½ºÅ©¸³ÆÃ ¿ÏÀü °¡À̵å | ||
|---|---|---|
| ÀÌÀü | 9Àå. º¯¼ö Àç°ËÅä(Variables Revisited) | ´ÙÀ½ |
Âü°í: $RANDOM Àº bash ³»ºÎ ÇÔ¼ö(»ó¼ö°¡ ¾Æ´Ô)·Î 0¿¡¼ 32767»çÀÌÀÇ Àǻ糼ö(pseudorandom)¸¦ ¸®ÅÏÇÕ´Ï´Ù. $RANDOM Àº ¾ÏÈ£È Å°¸¦ ¹ß»ý ½Ã۴µ¥ ¾µ ¼ö ¾ø½À´Ï´Ù.
¿¹ 9-19. ·£´ýÇÑ ¼ýÀÚ ¸¸µé±â
#!/bin/bash
# $RANDOM Àº ºÒ¸± ¶§¸¶´Ù ´Ù¸¥ ¹«ÀÛÀ§ Á¤¼ö °ªÀ» ¸®ÅÏÇÕ´Ï´Ù.
# ¸íĪ»óÀÇ ¹üÀ§(nominal range): 0 - 32767(16 ºñÆ® ¾çÀÇ Á¤¼ö).
MAXCOUNT=10
count=1
echo
echo "$MAXCOUNT °³ÀÇ ·£´ýÇÑ ¼ýÀÚ:"
echo "-----------------"
while [ "$count" -le $MAXCOUNT ] # 10 ($MAXCOUNT) °³ÀÇ ·£´ý Á¤¼ö ¹ß»ý.
do
number=$RANDOM
echo $number
let "count += 1" # Ä«¿îÅÍ Áõ°¡.
done
echo "-----------------"
# ¾î¶² ¹üÀ§ÀÇ ·£´ý °ªÀÌ ÇÊ¿äÇÏ´Ù¸é '³ª¸ÓÁö(modulo)' ¿¬»êÀÚ¸¦ ¾²¸é,
# ¾î¶² ¼ö¸¦ ³ª´« ³ª¸ÓÁö °ªÀ» ¸®ÅÏÇØ ÁÝ´Ï´Ù.
RANGE=500
echo
number=$RANDOM
let "number %= $RANGE"
echo "$RANGE º¸´Ù ÀÛÀº ·£´ýÇÑ ¼ýÀÚ --- $number"
echo
# ¾î¶² °ªº¸´Ù Å« ·£´ýÇÑ Á¤¼ö°¡ ÇÊ¿äÇÏ´Ù¸é
# ±× °ªº¸´Ù ÀÛÀº ¼ö´Â ¹«½ÃÇÏ´Â Å×½ºÆ® ¹®À» °É¸é µË´Ï´Ù.
FLOOR=200
number=0 # ÃʱâÈ
while [ "$number" -le $FLOOR ]
do
number=$RANDOM
done
echo "$FLOOR º¸´Ù Å« ·£´ýÇÑ ¼ýÀÚ --- $number"
echo
# »óÇѰª°ú ÇÏÇѰª »çÀÌÀÇ ¼ö°¡ ÇÊ¿äÇÏ´Ù¸é À§ÀÇ µÎ Å×Å©´ÐÀ» °°ÀÌ ¾²¸é µË´Ï´Ù.
number=0 # ÃʱâÈ
while [ "$number" -le $FLOOR ]
do
number=$RANDOM
let "number %= $RANGE" # $number °¡ $RANGE ¾È¿¡ µé¾î¿À°Ô.
done
echo "$FLOOR ¿Í $RANGE »çÀÌÀÇ ·£´ýÇÑ ¼ýÀÚ --- $number"
echo
# "Âü"À̳ª "°ÅÁþ"Áß¿¡ Çϳª¸¦ °í¸£µµ·Ï ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.
BINARY=2
number=$RANDOM
T=1
let "number %= $BINARY"
# let "number >>= 14" ´õ ÁÁÀº ºÐÆ÷ÀÇ ·£´ý°ªÀ» ÁÝ´Ï´Ù.
# (¸¶Áö¸· µÎ ºñÆ®¸¦ Á¦¿ÜÇÏ°í ¸ðµÎ ¿À¸¥ÂÊÀ¸·Î ½¬ÇÁÆ® ½ÃÅ´).
if [ "$number" -eq $T ]
then
echo "TRUE"
else
echo "FALSE"
fi
echo
# ÁÖ»çÀ§ ´øÁö±â¸¦ Èä³»³» º¼±î¿ä?
SPOTS=7 # 7 ÀÇ ³ª¸ÓÁö(modulo)´Â 0 - 6.
DICE=2
ZERO=0
die1=0
die2=0
# Á¤È®ÇÑ È®·üÀ» À§Çؼ µÎ °³ÀÇ ÁÖ»çÀ§¸¦ µû·Î ´øÁý½Ã´Ù.
while [ "$die1" -eq $ZERO ] # ÁÖ»çÀ§¿¡ 0Àº ¾øÁÒ.
do
let "die1 = $RANDOM % $SPOTS" # ù¹øÂ° ÁÖ»çÀ§¸¦ ±¼¸®°í.
done
while [ "$die2" -eq $ZERO ]
do
let "die2 = $RANDOM % $SPOTS" # µÎ¹øÂ°¸¦ ±¼¸®¸é.
done
let "throw = $die1 + $die2"
echo "µÎ ÁÖ»çÀ§¸¦ ´øÁø °á°ú = $throw"
echo
exit 0 |
RANDOM ÀÌ ¾ó¸¶³ª ·£´ýÇÒ±î¿ä? ÀÌ°É È®ÀÎÇØ º¸´Â °¡Àå ÁÁÀº ¹æ¹ýÀº RANDOM ÀÌ ¹ß»ý ½ÃŰ´Â "·£´ý"ÇÑ ¼ýÀÚÀÇ ºÐÆ÷¸¦ ÃßÀûÇÏ´Â ½ºÅ©¸³Æ®¸¦ ¸¸µé¾î º¸´Â °ÍÀÔ´Ï´Ù. ±×·³ RANDOM ÁÖ»çÀ§¸¦ ¸î ¹ø ´øÁ® º¾½Ã´Ù.
¿¹ 9-20. RANDOM À¸·Î ÁÖ»çÀ§¸¦ ´øÁö±â
#!/bin/bash
# RANDOM ÀÌ ¾ó¸¶³ª ·£´ýÇѰ¡?
RANDOM=$$ # ½ºÅ©¸³Æ®ÀÇ ÇÁ·Î¼¼½º ID ¸¦ ½á¼ ·£´ý ³Ñ¹ö ¹ß»ý±âÀÇ seed¸¦ ´Ù½Ã »ý¼º.
PIPS=6 # ÁÖ»çÀ§´Â ´«ÀÌ 6°³ÁÒ.
MAXTHROWS=600 # ½Ã°£ÀÌ ³²¾Æ µ¹¸é ÀÌ ¼ýÀÚ¸¦ ´õ ´Ã·Áº¸¼¼¿ä.
throw=0 # ´øÁø ¼ýÀÚ.
zeroes=0 # Ãʱâȸ¦ ¾È Çϸé 0ÀÌ ¾Æ´Ï¶ó ³ÎÀÌ µÇ±â ¶§¹®¿¡
ones=0 # 0À¸·Î ÃʱâÈ ÇØ¾ß µË´Ï´Ù.
twos=0
threes=0
fours=0
fives=0
sixes=0
print_result ()
{
echo
echo "ones = $ones"
echo "twos = $twos"
echo "threes = $threes"
echo "fours = $fours"
echo "fives = $fives"
echo "sixes = $sixes"
echo
}
update_count()
{
case "$1" in
0) let "ones += 1";; # ÁÖ»çÀ§¿¡ "0"ÀÌ ¾øÀ¸´Ï±î ÀÌ°É 1À̶ó°í Çϰí
1) let "twos += 1";; # ÀÌ°É 2¶ó°í Çϰí.... µîµî..
2) let "threes += 1";;
3) let "fours += 1";;
4) let "fives += 1";;
5) let "sixes += 1";;
esac
}
echo
while [ "$throw" -lt "$MAXTHROWS" ]
do
let "die1 = RANDOM % $PIPS"
update_count $die1
let "throw += 1"
done
print_result
# RANDOM ÀÌ Á¤¸» ·£´ýÇÏ´Ù¸é °á°ú ºÐÆ÷´Â È®½ÇÈ÷ °í¸£°Ô ³ª¿Ã °ÍÀÔ´Ï´Ù.
# $MAXTHROWS °¡ 600 ÀÏ ¶§´Â °¢°¢Àº 100 ¿¡¼ 20 Á¤µµÀÇ Â÷À̸¦ µÎ°í ºÐ»êµÇ¾î¾ß ÇÕ´Ï´Ù.
#
# ÁÖÀÇÇÒ °ÍÀº RANDOM ÀÌ Àǻ糼ö(pseudorandom) ¹ß»ý±âÀ̱⠶§¹®¿¡
# ÁøÂ¥·Î ·£´ýÇÑ °ÍÀº ¾Æ´Ï¶ó´Â Á¡ÀÔ´Ï´Ù.
# ½¬¿î ¿¬½À¹®Á¦ Çϳª ³¾²²¿ä.
# ÀÌ ½ºÅ©¸³Æ®¸¦ µ¿Àü 1000 ¹ø µÚÁý´Â °É·Î ¹Ù²ãº¸¼¼¿ä.
# "¾Õ"À̳ª "µÚ" Áß¿¡ Çϳª°¡ ³ª¿À°ÚÁÒ?
exit 0 |
À§ÀÇ ¿¹Á¦¿¡¼ »ìÆìº» °Íó·³ RANDOM ¹ß»ý±â°¡ ½ÇÇàµÉ ¶§¸¶´Ù ·£´ý¿ë seed¸¦ "´Ù½Ã" ¸¸µé¾î ÁÖ´Â °ÍÀÌ ÁÁ½À´Ï´Ù. RANDOM¿¡ °°Àº seed¸¦ ¾²¸é °°Àº ¼ø¼ÀÇ ¼ýÀÚ°¡ ¹Ýº¹µË´Ï´Ù(ÀÌ´Â CÀÇ random() ÇÔ¼öÀÇ µ¿ÀÛÀ» ±×´ë·Î ¹Ý¿µÇØ ÁÝ´Ï´Ù).
¿¹ 9-21. RANDOM ¿¡ seed¸¦ ´Ù½Ã ÁöÁ¤ÇØ ÁÖ±â
#!/bin/bash
# seeding-random.sh: RANDOM º¯¼ö¿¡ seed Àû¿ë.
MAXCOUNT=25 # ¹ß»ý½Ãų ¼ýÀÚ °¹¼ö.
random_numbers ()
{
count=0
while [ "$count" -lt "$MAXCOUNT" ]
do
number=$RANDOM
echo -n "$number "
let "count += 1"
done
}
echo; echo
RANDOM=1 # ·£´ý ³Ñ¹ö ¹ß»ý±â¿¡ RANDOM seed ¼¼ÆÃ.
random_numbers
echo; echo
RANDOM=1 # ¶È°°Àº seed »ç¿ë....
random_numbers # ... ¿ÏÀüÈ÷ ¶È°°Àº ¼ö¿ÀÌ ¹ß»ý.
echo; echo
RANDOM=2 # ´Ù¸¥ seed ·Î Àç½Ãµµ...
random_numbers # ´Ù¸¥ ¼ö¿ ¹ß»ý.
echo; echo
# RANDOM=$$ ¶ó°í ÇÏ´Â °ÍÀº RANDOM ¿¡ ½ºÅ©¸³Æ®ÀÇ ÇÁ·Î¼¼½º ID·Î seed¸¦ ¼¼ÆÃÇÏ´Â °ÍÀÔ´Ï´Ù.
# 'time' À̳ª 'date'·Î ÇÒ ¼öµµ Àְڳ׿ä.
# ´õ ¸ÚÁö°Ô ÇØ º¸ÁÒ.
SEED=$(head -1 /dev/urandom | od -N 1 | awk '{ print $2 }')
# /dev/urandom(½Ã½ºÅÛ¿¡¼ Á¦°øÇÏ´Â Àǻ糼ö "µð¹ÙÀ̽º")¿¡¼ ¾òÀº Àǻ糼ö
# ±× ´ÙÀ½ "od"¸¦ ÀÌ¿ëÇØ¼ Ãâ·Â °¡´ÉÇÑ(8Áø¼ö) ¼ýÀÚ·Î ÀÌ·ç¾îÁø ÁÙ·Î º¯È¯.
# ¸¶Áö¸·À¸·Î "awk"¸¦ ½á¼ SEED ¿¡¼ ¾µ ÇÑ °³ÀÇ ¼ýÀÚ¸¦ »Ì¾Æ³¿.
RANDOM=$SEED
random_numbers
echo; echo
exit 0 |
Âü°í: /dev/urandom µð¹ÙÀ̽º ÆÄÀÏÀº $RANDOM º¸´Ù ´õ "·£´ý"ÇÑ Àǻ糼ö¸¦ ¹ß»ý ½ÃÄÑÁÝ´Ï´Ù. dd if=/dev/urandom of=targetfile bs=1 count=XX ¶ó°í Çϸé Àß ºÐ»êµÈ °¡»ó·£´ý °ªÀ» °®´Â ÆÄÀÏÀ» ¸¸µé¾î ÁÝ´Ï´Ù. ÇÏÁö¸¸, ÀÌ·± ¼ýÀÚ¸¦ ½ºÅ©¸³Æ®ÀÇ º¯¼ö¿¡ ÇÒ´çÇÏ´Â °ÍÀº od(À§ÀÇ ¿¹Á¦Ã³·³)³ª dd(¿¹ 12-33 Âü°í)·Î ÇÊÅ͸µÀ» ÇÏ´Â µîÀÇ Ã³¸®°¡ ÇÊ¿äÇÕ´Ï´Ù.