From 4debccf0cf88fda95675c625efb63d34c35876e4 Mon Sep 17 00:00:00 2001 From: Sam Hadow Date: Mon, 7 Apr 2025 15:08:22 +0200 Subject: [PATCH] non biased randon number --- README.md | 4 ++-- randint.sh | 12 ++++++++++-- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 3e8bbde..65675e6 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,8 @@ My collection of useful shell scripts. ### randint.sh -usage: randint -print in the terminal a random integer x with $` 0 \leq x \lt \$1`$ +usage: randint \ \[fast\] +print in the terminal a random integer x with $` 0 \leq x \leq \$1`$ ### killwine.sh kill every wine process including processes hanging diff --git a/randint.sh b/randint.sh index 2450e19..88ad5ff 100755 --- a/randint.sh +++ b/randint.sh @@ -1,6 +1,6 @@ #!/bin/bash if ! [[ "$1" =~ ^[0-9]+$ ]]; then - echo "Usage: randint " + echo "Usage: randint [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