diff --git a/README.md b/README.md index 65675e6..13dcfa9 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ My collection of useful shell scripts. ### randint.sh -usage: randint \ \[fast\] +usage: randint \ print in the terminal a random integer x with $` 0 \leq x \leq \$1`$ ### killwine.sh diff --git a/randint.sh b/randint.sh index 88ad5ff..d96795a 100755 --- a/randint.sh +++ b/randint.sh @@ -1,6 +1,6 @@ #!/bin/bash if ! [[ "$1" =~ ^[0-9]+$ ]]; then - echo "Usage: randint [fast]" + echo "Usage: randint " exit 1 fi number=$1 @@ -8,13 +8,10 @@ ceiling=$(echo "l($number +1)/l(2)" | bc -l | awk '{ bits = ($1 == int($1)) ? $1 : int($1) + 1; print int( (bits + 7) / 8 ) }') - -if [[ "$2" == "fast" ]]; then - random_num=$(xxd -p -l $ceiling /dev/urandom | tr -d '\n' | awk -v num="$number+1" '{print strtonum("0x" $0) % num}') -else - while :; do - random_num=$(xxd -p -l $ceiling /dev/urandom | tr -d '\n' | awk '{print strtonum("0x" $0)}') - (( random_num < number )) && break - done -fi +random_num=$(xxd -p -l $ceiling /dev/urandom | tr -d '\n' | \ + awk -v max="$number" -v scale="$ceiling" '{ + val = strtonum("0x" $0); + range = 2**(scale*8); + print int(val * max / range) + }') echo $random_num