| 1 | # Originally
|
|---|
| 2 | #
|
|---|
| 3 | # From: [email protected] (Brian S Hiles)
|
|---|
| 4 | # Newsgroups: comp.unix.shell
|
|---|
| 5 | # Subject: Re: getting random numbers
|
|---|
| 6 | # Date: 23 Jan 1997 23:27:30 GMT
|
|---|
| 7 | # Message-ID: <[email protected]>
|
|---|
| 8 |
|
|---|
| 9 | # @(#) krand Produces a random number within integer limits
|
|---|
| 10 | # "krand" Korn shell script generates a random number in a
|
|---|
| 11 | # specified range with an optionally specified ``seed'' value.
|
|---|
| 12 | # Author: Peter Turnbull, May 1993
|
|---|
| 13 | # Modified by: Becca Thomas, January 1994
|
|---|
| 14 |
|
|---|
| 15 | # changed the optional third argument to a -s option, converted to
|
|---|
| 16 | # bash v2 syntax -- [email protected]
|
|---|
| 17 |
|
|---|
| 18 | PROGNAME=${0##*/}
|
|---|
| 19 | USAGE="usage: $PROGNAME [-s seed] lower-limit upper-limit"
|
|---|
| 20 |
|
|---|
| 21 | Seed=$$ # Initialize random-number seed value with PID
|
|---|
| 22 |
|
|---|
| 23 | usage()
|
|---|
| 24 | {
|
|---|
| 25 | echo ${PROGNAME}: "$USAGE" >&2
|
|---|
| 26 | }
|
|---|
| 27 |
|
|---|
| 28 | errexit()
|
|---|
| 29 | {
|
|---|
| 30 | echo ${PROGNAME}: "$@" >&2
|
|---|
| 31 | exit 1
|
|---|
| 32 | }
|
|---|
| 33 |
|
|---|
| 34 | # Process command-line arguments:
|
|---|
| 35 | while getopts "s:" opt; do
|
|---|
| 36 | case "$opt" in
|
|---|
| 37 | s) Seed=$OPTARG ;;
|
|---|
| 38 | *) usage ; exit 2;;
|
|---|
| 39 | esac
|
|---|
| 40 | done
|
|---|
| 41 |
|
|---|
| 42 | shift $(($OPTIND - 1))
|
|---|
| 43 |
|
|---|
| 44 | case $# in
|
|---|
| 45 | 2) Lower=$1; Upper=$2 ;;
|
|---|
| 46 | *) usage ; exit 2;;
|
|---|
| 47 | esac
|
|---|
| 48 |
|
|---|
| 49 | # Check that specified values are integers:
|
|---|
| 50 | expr "$Lower" + 0 >/dev/null 2>&1
|
|---|
| 51 | [ $? -eq 2 ] && { errexit "lower ($Lower) not an integer"; }
|
|---|
| 52 | expr "$Upper" + 0 >/dev/null 2>&1
|
|---|
| 53 | [ $? -eq 2 ] && { errexit "upper ($Upper) not an integer"; }
|
|---|
| 54 | expr "$Seed" + 0 >/dev/null 2>&1
|
|---|
| 55 | [ $? -eq 2 ] && { errexit "seed ($Seed) not an integer"; }
|
|---|
| 56 |
|
|---|
| 57 | # Check that values are in the correct range:
|
|---|
| 58 | if (( "$Lower" < 0 )) || [ ${#Lower} -gt 5 ]; then
|
|---|
| 59 | errexit "lower limit ($Lower) less than zero"
|
|---|
| 60 | fi
|
|---|
| 61 | if (( "$Upper" > 32767 )) || [ ${#Upper} -gt 5 ]; then
|
|---|
| 62 | errexit "upper limit ($Upper) greater than 32767"
|
|---|
| 63 | fi
|
|---|
| 64 | if (( "$Seed" < 0 )) || (( "$Seed" > 32767 )) || [ ${#Seed} -gt 5 ]; then
|
|---|
| 65 | errexit "seed value ($Seed) out of range (0 to 32767)"
|
|---|
| 66 | fi
|
|---|
| 67 | (( "$Upper" <= "$Lower" )) && errexit "upper limit ($Upper) <= lower limit ($Lower)"
|
|---|
| 68 |
|
|---|
| 69 | # Seed the random-number generator:
|
|---|
| 70 | RANDOM=$Seed
|
|---|
| 71 | # Compute value, scaled within range:
|
|---|
| 72 | let rand="$RANDOM % ($Upper - $Lower + 1) + $Lower"
|
|---|
| 73 | # Report result:
|
|---|
| 74 | echo $rand
|
|---|