从列表中加权随机

时间:2014-08-06 12:19:38

标签: python

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

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

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

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

1 个答案:

答案 0 :(得分: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以了解许多选项的比较。