non biased randon number
This commit is contained in:
parent
25194c1e55
commit
4debccf0cf
@ -3,8 +3,8 @@
|
||||
My collection of useful shell scripts.
|
||||
|
||||
### randint.sh
|
||||
usage: randint <positive integer>
|
||||
print in the terminal a random integer x with $` 0 \leq x \lt \$1`$
|
||||
usage: randint \<positive integer\> \[fast\]
|
||||
print in the terminal a random integer x with $` 0 \leq x \leq \$1`$
|
||||
|
||||
### killwine.sh
|
||||
kill every wine process including processes hanging
|
||||
|
12
randint.sh
12
randint.sh
@ -1,6 +1,6 @@
|
||||
#!/bin/bash
|
||||
if ! [[ "$1" =~ ^[0-9]+$ ]]; then
|
||||
echo "Usage: randint <positive integer>"
|
||||
echo "Usage: randint <positive integer> [fast]"
|
||||
exit 1
|
||||
fi
|
||||
number=$1
|
||||
@ -8,5 +8,13 @@ ceiling=$(echo "l($number +1)/l(2)" | bc -l | awk '{
|
||||
bits = ($1 == int($1)) ? $1 : int($1) + 1;
|
||||
print int( (bits + 7) / 8 )
|
||||
}')
|
||||
random_num=$(xxd -p -l $ceiling /dev/urandom | tr -d '\n' | awk -v num="$number" '{print strtonum("0x" $0) % num}')
|
||||
|
||||
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
|
||||
echo $random_num
|
||||
|
Loading…
x
Reference in New Issue
Block a user