From a230d320422245e3ac0d1fc63d01248606909a4a Mon Sep 17 00:00:00 2001 From: deajan Date: Mon, 1 Oct 2018 11:27:01 +0200 Subject: [PATCH] Improve PoorMansRandomGenerator function --- dev/ofunctions.sh | 43 +++++++++++-------------------------------- 1 file changed, 11 insertions(+), 32 deletions(-) diff --git a/dev/ofunctions.sh b/dev/ofunctions.sh index 4b99bd2..84f2946 100644 --- a/dev/ofunctions.sh +++ b/dev/ofunctions.sh @@ -8,7 +8,7 @@ #### OFUNCTIONS FULL SUBSET #### #### OFUNCTIONS MINI SUBSET #### _OFUNCTIONS_VERSION=2.3.0-RC1 -_OFUNCTIONS_BUILD=2018100101 +_OFUNCTIONS_BUILD=2018100102 #### _OFUNCTIONS_BOOTSTRAP SUBSET #### _OFUNCTIONS_BOOTSTRAP=true #### _OFUNCTIONS_BOOTSTRAP SUBSET END #### @@ -105,38 +105,17 @@ fi #### PoorMansRandomGenerator SUBSET #### # Get a random number on Windows BusyBox alike, also works on most Unixes function PoorMansRandomGenerator { - local digits="${1}" # The number of digits to generate + local digits="${1}" # The number of digits to generate + local number - local minimum=1 - local maximum - local n=0 - - if [ "$digits" == "" ]; then - digits=5 - fi - - # Minimum already has a digit - for n in $(seq 1 $((digits-1))); do - minimum=$minimum"0" - maximum=$maximum"9" - done - maximum=$maximum"9" - - #n=0; while [ $n -lt $minimum ]; do n=$n$(dd if=/dev/urandom bs=100 count=1 2>/dev/null | tr -cd '0-9'); done; n=$(echo $n | sed -e 's/^0//') - # bs=19 since if real random strikes, having a 19 digits number is not supported - while [ $n -lt $minimum ] || [ $n -gt $maximum ]; do - if [ $n -lt $minimum ]; then - # Add numbers - n=$n$(dd if=/dev/urandom bs=19 count=1 2>/dev/null | tr -cd '0-9') - n=$(echo $n | sed -e 's/^0//') - if [ "$n" == "" ]; then - n=0 - fi - elif [ $n -gt $maximum ]; then - n=$(echo $n | sed 's/.$//') - fi - done - echo $n + # Some read bytes can't be used, se we read twice the number of required bytes + dd if=/dev/urandom bs=$digits count=2 | while read -r -n1 char; do + number=$number$(printf "%d" "'$char") + if [ ${#number} -ge $digits ]; then + echo ${number:0:$digits} + break; + fi + done } #### PoorMansRandomGenerator SUBSET END ####