我有一个整数列表,我希望能够根据该列表中的权重选择一个随机数。
例如,假设我有一个这样的列表:List = [20,40,80,60]
。
我选择数字1(或0取决于你如何看待它)的几率为10%,获得数字3的几率为30%。
我将如何以pythonic方式进行此操作?
答案 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 method和this article以了解许多选项的比较。