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:


    Because of excessive load, this site is generated statically every several hours. Therefore, your comment may take some time to appear here. Unless you get an error message when you click the select button below, then all is normal and the comment will appear in due course. If you want you can checkout all recently approved comments while your waiting.