【问题标题】:Weighted random from int list [duplicate]来自int列表的加权随机[重复]
【发布时间】:2014-08-07 01:36:24
【问题描述】:

我有一个整数列表,我希望能够根据该列表中的权重选择一个随机数。

例如,假设我有一个这样的列表:List = [20,40,80,60]

我选择数字 1(或 0,取决于你如何看待它)的机会是 10%,获得数字 3 的机会是 30%。

我将如何以 Python 的方式进行此操作?

【问题讨论】:

标签: python


【解决方案1】:

一个简单的算法可能如下所示:

import bisect
import random
def random_choice(choices, weights):
    """
    >>> a = ['Hit', 'Out']
    >>> b = [.3, .7]
    >>> random_choice(a,b)
    """
    cumsums = []
    c = 0
    for weight in weights:
        c += weight
        cumsums.append(c)
    rnd = random.uniform(0, c)
    i = bisect.bisect(cumsums, rnd)
    return choices[i]

演示:

>>> random_choice(list('ABCD'), weights=[20,40,80,60])
'C'

但是,如果您计划多次调用random_choice,则有些算法会更有效。 例如,请参阅 Alias methodthis article 以比较许多选项。

【讨论】:

  • 谢谢你,它就像一个魅力。不完全符合我的需要,但我做到了。
猜你喜欢
  • 2017-05-09
  • 1970-01-01
  • 2011-10-07
  • 1970-01-01
  • 2019-08-24
  • 2014-06-28
  • 2016-02-01
  • 2011-06-05
相关资源
最近更新 更多