randint with range and float to int approximation
This commit is contained in:
parent
4debccf0cf
commit
91b79383e8
@ -3,7 +3,7 @@
|
|||||||
My collection of useful shell scripts.
|
My collection of useful shell scripts.
|
||||||
|
|
||||||
### randint.sh
|
### randint.sh
|
||||||
usage: randint \<positive integer\> \[fast\]
|
usage: randint \<positive integer\>
|
||||||
print in the terminal a random integer x with $` 0 \leq x \leq \$1`$
|
print in the terminal a random integer x with $` 0 \leq x \leq \$1`$
|
||||||
|
|
||||||
### killwine.sh
|
### killwine.sh
|
||||||
|
17
randint.sh
17
randint.sh
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
if ! [[ "$1" =~ ^[0-9]+$ ]]; then
|
if ! [[ "$1" =~ ^[0-9]+$ ]]; then
|
||||||
echo "Usage: randint <positive integer> [fast]"
|
echo "Usage: randint <positive integer>"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
number=$1
|
number=$1
|
||||||
@ -8,13 +8,10 @@ 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' | \
|
||||||
if [[ "$2" == "fast" ]]; then
|
awk -v max="$number" -v scale="$ceiling" '{
|
||||||
random_num=$(xxd -p -l $ceiling /dev/urandom | tr -d '\n' | awk -v num="$number+1" '{print strtonum("0x" $0) % num}')
|
val = strtonum("0x" $0);
|
||||||
else
|
range = 2**(scale*8);
|
||||||
while :; do
|
print int(val * max / range)
|
||||||
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user