【问题标题】:Suppose I have three weighted choices: how do I randomly select one? [duplicate]假设我有三个加权选择:我如何随机选择一个? [复制]
【发布时间】:2013-02-08 18:27:34
【问题描述】:

例如我有这三个选项:

 Option 1
 Option 2
 Option 3

我想随机选择其中一个,但有一定的概率偏差。例如:

 Option 1: 30% chance
 Option 2: 50% chance
 Option 3: 20% chance

那么在保留它们在 python 中发生的概率的同时随机选择一个的最佳方法是什么?

【问题讨论】:

    标签: python random probability


    【解决方案1】:

    效率不高,但很容易:

    random.choice([1]*30 + [2]*50 + [3]*20)
    

    【讨论】:

    • 这是一个非常简单有效的答案; +1。此外,它不会太慢,因为您将拥有的最大元素数量(假设权重是基于整数百分比的系统)是 100。但是,如果权重不是百分比或者它使用百分比是分数(尤其是不合理的),它可能会变得低效。
    • 您可以通过分别乘以 3、5 和 2 使其更“高效”:)
    • 非常简单。谢谢。
    【解决方案2】:

    这行得通:

    import random
    
    def weighted_choice(weights):
        choice = random.random() * sum(weights)
        for i, w in enumerate(weights):
            choice -= w
            if choice < 0:
                return i
    
    weighted_choice([.3, .5, .2])   # returns 0,1,2 in proportion to the weight
    

    测试它:

    import collections
    c = collections.Counter()
    n = 1000000
    for i in range(n):
        c[weighted_choice([.3, .5, .2])] += 1
    
    for k, v in c.items():
        print '{}: {:.2%}'.format(k,float(v)/n)
    

    打印:

    0: 30.11%
    1: 50.08%
    2: 19.81%
    

    优点,除了相当快,1)列表元素加起来不需要1或100,2)更多选择,只需向列表中添加更多元素:

    for i in range(n):
       c[weighted_choice([.3,.35,.1,.1,.15,.4])]+=1
    

    打印:

    0: 21.61%
    1: 25.18%
    2: 7.22%
    3: 7.03%
    4: 10.57%
    5: 28.38%
    

    (根据接受的答案计时,大约快 2 倍...)

    【讨论】:

      猜你喜欢
      • 2019-08-08
      • 2013-10-01
      • 2017-09-20
      • 2015-07-05
      • 2010-09-08
      • 1970-01-01
      • 2016-05-18
      相关资源
      最近更新 更多