【问题标题】:Python: Select Item from Object List Based on Probability [duplicate]Python:根据概率从对象列表中选择项目[重复]
【发布时间】:2012-09-14 06:09:40
【问题描述】:

可能重复:
Weighted random selection with and without replacement

我有一个很长的项目对象列表。我想根据概率从列表中随机选择一个项目。该列表如下所示:

class Item:
  def __init__(self, pid, hits, qtyPerOrder):
    self.pid = pid
    self.bay = hits
    self.qtyPerOrder = int(qtyPerOrder)

itemList = [('RGSCAF', 181  ,6), ('WAR10227', 54    ,3), ('AD2020WOC', 31   ,4)]

基本上,我想要一个函数来遍历列表,根据命中分配概率权重,然后根据概率随机选择 n 个对象。所以在这个例子中,对象 ('RGSCAF', 181 ,6) 被返回的概率会更高,因为它具有最高的命中值。

【问题讨论】:

标签: python list class probability


【解决方案1】:

不是最快的解决方案,但可以理解:

def getNWeightedRandoms(n):
    retval = []
    for x in xrange(0,n):
        retval.append(weightedRandom())
    return retval

def weightedRandom():
    sum = 0
    for item in itemList:
        sum += item.bay
    i = random.randint(0,sum-1)
    for item in itemList:
        i -= item.bay
        if i<0:
            return item

【讨论】:

  • 这不会返回大小为n 的样本,只会选择一个项目。
  • 增加了调用 weightedRandom n 次的函数。
  • 该方法允许重复,我认为这不是 OP 想要的。
  • getNWeightedRandoms(n) 似乎运行了一个无限循环
  • 这可能只是需要很长时间,因为它是 O(N*M),其中 M 是列表的大小。您可以通过存储每个项目的累积命中来加速它(例如,项目 2 的 cumhits 等于 0.hits + 1.hits + 2.hits),然后在 weightedRandom 中使用 bisect 而不是 for 循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2020-09-06
  • 1970-01-01
相关资源
最近更新 更多