Python 整数列表中的加权随机数

Python 整数列表中的加权随机数,python,Python,我有一个整数列表,我希望能够根据列表中的权重选择一个随机数 例如,假设我有这样一个列表:list=[20,40,80,60] 我选择数字1(或0,取决于你怎么看)的几率是10%,而选择数字3的几率是30% 我该如何以pythonic的方式进行此操作?一个简单的算法可能如下所示: import bisect import random def random_choice(choices, weights): """ >>> a = ['Hit', 'Out']

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

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

我选择数字1(或0,取决于你怎么看)的几率是10%,而选择数字3的几率是30%


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

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

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\u choice
,则有些算法会更有效。
有关许多选项的比较,请参见和。

您看到了吗?谢谢你,它很有魅力。不完全符合我的需要,但我成功了。
>>> random_choice(list('ABCD'), weights=[20,40,80,60])
'C'