And then Nemo wanted weighted random numbers

    Nemo then wanted weighted random numbers, so this item has been added to this page. The following script selects a random element from a weight list of options...

    
    #!/bin/bash
    
    
    
    # Copyright (c) Michael Still 2002
    
    # Released under the terms of the GNU GPL
    
    
    
    # In this case, Nemo wants to be able to specify a list of items, with
    
    # weights associated with them...
    
    
    
    # $1 is the list with weights, in the form:
    
    # "1 frog 2 banana 3 hamster"
    
    
    
    # Scary assumption number one, people hand me correctly formatted lists
    
    # Incidentally, this will break with numbers exist in the items I am handed
    
    # e.g. Banana42 will break this
    
    NUMBERS=`echo $1 | sed 's/[^0-9 ]//g'`
    
    WORDS=`echo $1 | sed 's/[0-9]//g'`
    
    WEIGHTED=""
    
    
    
    # Build the list of options, including the weights
    
    for NUM in $NUMBERS
    
    do
    
      WORD=`echo $WORDS | sed 's/ .*$//'`
    
      WORDS=`echo $WORDS | sed "s/^$WORD *//"`
    
    
    
      COUNT=0
    
      while [ $COUNT -lt $NUM ]
    
      do
    
        WEIGHTED=`echo "$WEIGHTED $WORD"`
    
        COUNT=$(( $COUNT + 1 ))
    
      done  
    
    done
    
    
    
    # Get the random number
    
    LOBOUND=1
    
    HIBOUND=`echo $WEIGHTED | wc -w`
    
    RANDMAX=32767
    
    BINUMBER=$(( $LOBOUND + ($HIBOUND * $RANDOM) / ($RANDMAX + 1) ))
    
    
    
    # Get the item -- I can't use shift, because it is not on the command line
    
    COUNT=1
    
    while [ $COUNT -lt $BINUMBER ]
    
    do
    
      WEIGHTED=`echo $WEIGHTED | sed 's/^[^ ]*//'`
    
      COUNT=$(( $COUNT + 1 ))
    
    done
    
    
    
    # The first word should be magic selected one
    
    echo $WEIGHTED | sed 's/ .*$//'
    
    


posted at: 04:00 | path: /bashrand | permanent link to this entry

    Add a comment to this post:

    Your name:

    Your email: Email me new comments on this post
      (Your email will not be published on this site, and will only be used to contact you directly with a reply to your comment if needed. Oh, and we'll use it to send you new comments on this post it you selected that checkbox.)


    Your website:

    Comments: