#!/bin/bash

#==BEGIN Function Definitions==
randFloat() {
    # Desc: Output random float
    # Usage: randFloat arg1
    # Inputs: arg1: number of decimal places
    # Output: stdout: float as decimal string
    # Version: 0.1.1
    # Note: Outputs float from 0.000... to 0.999...
    # Note: Default number of decimals is 5.
    # Ref/Attrib: Integer test regular expression https://stackoverflow.com/a/806923

    # Validate input
    if [[ $# -eq 0 ]]; then
    	: # do nothing
    elif [[ $# -eq 1 ]]; then
    	arg1=$1;
    	RETEST1='^[0-9]+$'
    	if ! [[ $arg1 =~ $RETEST1 ]]; then
    	    echo "ERROR:Not an integer." >&2; exit 1;
    	fi;
    else
    	echo "ERROR:Invalid number of arguments:${*}";
    fi;

    # Produce output
    decimals="$(head -c "${arg1:-5}" < <(LC_ALL=C tr -cd "[:digit:]" < <(cat /dev/urandom)))";
    printf "0.%s\n" "$decimals";
}; # output random float [0.00000 1.00000] to stdout
#==END Function Definitions==

#==BEGIN sample code==
time randFloat;
dec=5
time randFloat;
dec=70
time randFloat;
time (randFloat && randFloat && randFloat && randFloat && randFloat && randFloat && randFloat && randFloat && randFloat && randFloat);
time (randFloat "$dec" && randFloat "$dec" && randFloat "$dec" && randFloat "$dec" && randFloat "$dec" && randFloat "$dec" && randFloat "$dec" && randFloat "$dec" && randFloat "$dec" && randFloat "$dec");
time (randFloat "$dec" &>/dev/null && randFloat "$dec" &>/dev/null && randFloat "$dec" &>/dev/null && randFloat "$dec" &>/dev/null && randFloat "$dec" &>/dev/null && randFloat "$dec" &>/dev/null && randFloat "$dec" &>/dev/null && randFloat "$dec" &>/dev/null && randFloat "$dec" &>/dev/null && randFloat "$dec" &>/dev/null);
#==END sample code==