aboutsummaryrefslogblamecommitdiff
path: root/bin/rndi.awk
blob: 02e0574f55f47460721f1dcdbb4550b4e77a17cb (plain) (tree)
1
2
3
4
5
6
7
8
                                                                            


                                                                             
 
       
                 
 


                                            
 


                                     

                                                                     
 
                                              


                             


                                                                      

                       
        
               

                                                                      
                                                   

                                      

        







                                         
# Get a low-quality random number between two integers. Depending on the awk
# implementation, if you don't have rnds(1df) available to generate a seed of
# sufficient quality, you might get very predictable random numbers based on
# the current epoch second.

BEGIN {
    self = "rndi"

    # Check we have two arguments
    if (ARGC != 3)
        fail("Need a lower and upper bound")

    # Floor args and check for sanity
    lower = int(ARGV[1] + 0)
    upper = int(ARGV[2] + 0)
    if (upper < lower)
        fail("Bounds must be numeric, first not greater than second")

    # Get a random seed if rnds(1df) available
    rnds = "rnds 2>/dev/null"
    rnds | getline seed
    close(rnds)

    # Truncate the seed to 8 characters because mawk might choke on it
    seed = substr(seed,1,8)
    if (length(seed))
        srand(seed + 0)
    else
        srand()

    # Print a random integer bounded by the first and second arguments
    print int(lower + rand() * (upper - lower + 1))

    # Bail before processing any lines
    exit
}

# Bailout function
function fail(str) {
    stderr = "cat >&2"
    printf "%s: %s\n", self, str | stderr
    close(stderr)
    exit(2)
}