9.6. $RANDOM: ·£´ýÇÑ Á¤¼ö ¸¸µé±â

Âü°í: $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 Âü°í)·Î ÇÊÅ͸µÀ» ÇÏ´Â µîÀÇ Ã³¸®°¡ ÇÊ¿äÇÕ´Ï´Ù.