【问题标题】:Choosing items from a list on a percentual basis按百分比从列表中选择项目
【发布时间】:2011-08-01 16:45:15
【问题描述】:

我有一个包含大约 40 个字符串的列表,并希望为每个项目分配一个权重/百分比。在运行时,我现在想要一个随机发生器根据其百分比从列表中选择一个项目。这意味着在足够大的样本量下,该项目被选中的次数将对应于分配的百分比。我面临的一个问题是,将来我可能想要扩展列表,然后必须为其他项目分配一个新的百分比。保存此列表并为各个项目分配权重的最佳方法是什么?

我可以想出一些方法来实现这一点,但它们都相当快速和肮脏,所以我希望有人能想到一个设计模式。我正在使用 Python,但由于这是概念性的,我并没有真正在寻找明确的示例。

非常感谢您的帮助。

【问题讨论】:

  • 每个项目的百分比是否取决于列表的其余部分?目前尚不清楚您要做什么。也许您的一个想法会更清楚地说明它?
  • 您是否需要一个“纯”python 解决方案,或者它可以基于例如scipy 和/或numpy(参见scipy.org)?谢谢
  • 是的,每个项目的百分比将取决于列表的其余部分。理想情况下,我会添加一个带有“重量”的新项目,并且我分配给该项目的重量会从列表中的所有其他项目中平均扣除。但我想这将是一个高级解决方案。
  • Pure python 是首选,但如果 numpy / scipy 解决方案产生明显更好的结果(无需掸掉我的微积分书),我会试一试
  • 我似乎迟到了(因为你已经接受了)但是,是的scipy/numpy 确实可以让你以非常直接的方式使用你的empirical distribution function。少得多的编码和非常好的性能(如果重要的话)。谢谢

标签: python list random


【解决方案1】:

查看此页面:Weighted random generation in Python

编辑:另见(关于 SO):A weighted version of random.choice

【讨论】:

  • 这是多么完美。谢谢杜桑!
  • 再次感谢杜桑。这正是我想要的
【解决方案2】:

一种方法是使用范围作为字典键(可能作为 2 元组)和字符串作为值。然后,您可以使用random.randint() 生成所有字典键值描述的范围内的整数。添加一个新字符串很容易,并且它的范围将其他的范围推到一边(缩小了它们的权重)。如果您不希望这种情况发生,那么无论如何您都必须重新加权。

{
    (0,10): "First string",
    (11,50): "Second string",
    (51,73): "Third string"
}

【讨论】:

  • 谢谢nmichaels,这是我最初想到的解决方案。也许这是最好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-23
  • 2020-08-03
  • 1970-01-01
相关资源
最近更新 更多