【发布时间】:2014-08-07 01:36:24
【问题描述】:
我有一个整数列表,我希望能够根据该列表中的权重选择一个随机数。
例如,假设我有一个这样的列表:List = [20,40,80,60]。
我选择数字 1(或 0,取决于你如何看待它)的机会是 10%,获得数字 3 的机会是 30%。
我将如何以 Python 的方式进行此操作?
【问题讨论】:
标签: python
我有一个整数列表,我希望能够根据该列表中的权重选择一个随机数。
例如,假设我有一个这样的列表:List = [20,40,80,60]。
我选择数字 1(或 0,取决于你如何看待它)的机会是 10%,获得数字 3 的机会是 30%。
我将如何以 Python 的方式进行此操作?
【问题讨论】:
标签: python
一个简单的算法可能如下所示:
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 以比较许多选项。
【讨论】: