non biased randon number

This commit is contained in:
Sam Hadow 2025-04-07 15:08:22 +02:00
parent 25194c1e55
commit 4debccf0cf
2 changed files with 12 additions and 4 deletions

View File

@ -3,8 +3,8 @@
My collection of useful shell scripts. My collection of useful shell scripts.
### randint.sh ### randint.sh
usage: randint <positive integer> usage: randint \<positive integer\> \[fast\]
print in the terminal a random integer x with $` 0 \leq x \lt \$1`$ print in the terminal a random integer x with $` 0 \leq x \leq \$1`$
### killwine.sh ### killwine.sh
kill every wine process including processes hanging kill every wine process including processes hanging

View File

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
if ! [[ "$1" =~ ^[0-9]+$ ]]; then if ! [[ "$1" =~ ^[0-9]+$ ]]; then
echo "Usage: randint <positive integer>" echo "Usage: randint <positive integer> [fast]"
exit 1 exit 1
fi fi
number=$1 number=$1
@ -8,5 +8,13 @@ ceiling=$(echo "l($number +1)/l(2)" | bc -l | awk '{
bits = ($1 == int($1)) ? $1 : int($1) + 1; bits = ($1 == int($1)) ? $1 : int($1) + 1;
print int( (bits + 7) / 8 ) 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 echo $random_num