Generate random numbers with a given (numerical) distribution

前端 未结 13 2302
我寻月下人不归
我寻月下人不归 2020-11-22 11:18

I have a file with some probabilities for different values e.g.:

1 0.1
2 0.05
3 0.05
4 0.2
5 0.4
6 0.2

I would like to generate random numb

13条回答
  •  青春惊慌失措
    2020-11-22 11:51

    from __future__ import division
    import random
    from collections import Counter
    
    
    def num_gen(num_probs):
        # calculate minimum probability to normalize
        min_prob = min(prob for num, prob in num_probs)
        lst = []
        for num, prob in num_probs:
            # keep appending num to lst, proportional to its probability in the distribution
            for _ in range(int(prob/min_prob)):
                lst.append(num)
        # all elems in lst occur proportional to their distribution probablities
        while True:
            # pick a random index from lst
            ind = random.randint(0, len(lst)-1)
            yield lst[ind]
    

    Verification:

    gen = num_gen([(1, 0.1),
                   (2, 0.05),
                   (3, 0.05),
                   (4, 0.2),
                   (5, 0.4),
                   (6, 0.2)])
    lst = []
    times = 10000
    for _ in range(times):
        lst.append(next(gen))
    # Verify the created distribution:
    for item, count in Counter(lst).iteritems():
        print '%d has %f probability' % (item, count/times)
    
    1 has 0.099737 probability
    2 has 0.050022 probability
    3 has 0.049996 probability 
    4 has 0.200154 probability
    5 has 0.399791 probability
    6 has 0.200300 probability
    

提交回复
热议问题