Search code examples
pythonlistselectdistributionprobability-density

Select one element from a list using python following the normal distribution


I would like to select one element from a list using python following the normal distribution. I have a list, e.g.,

alist = ['an', 'am', 'apple', 'cool', 'why']

For example, according to the probability density function (PDF) of normal distribution, the 3rd element in the given list should have the largest probability to be chosen.Any suggestions?


Solution

  • from random import normalvariate
    
    def normal_choice(lst, mean=None, stddev=None):
        if mean is None:
            # if mean is not specified, use center of list
            mean = (len(lst) - 1) / 2
    
        if stddev is None:
            # if stddev is not specified, let list be -3 .. +3 standard deviations
            stddev = len(lst) / 6
    
        while True:
            index = int(normalvariate(mean, stddev) + 0.5)
            if 0 <= index < len(lst):
                return lst[index]
    

    then

    alist = ['an', 'am', 'apple', 'cool', 'why']
    for _ in range(20):
        print(normal_choice(alist))
    

    gives

    why
    an
    cool
    cool
    cool
    apple
    cool
    apple
    am
    am
    apple
    apple
    apple
    why
    cool
    cool
    cool
    am
    am
    apple