我想到的第一件事是:对它们进行排序并加起来。
假设您已经听从了我的建议并像这样更改了 dict 的结构:
mychoice = {2: 0.7, 1: 0.2, 3: 0.1}
让我们用累积的权重构建一个字典:
temp = sorted(((v, w) for v, w in mychoice.items()), key = lambda x: x[1], reverse = True)
accum = [(val[0], sum(_[1] for _ in temp[:i+1])) for i, val in enumerate(temp)]
(这有点乱,有人可以优化吗?)
无论如何,现在你accum
有[(2, 0.7), (1, 0.9), (3, 1)]
所以:
r = random.random()
for vw in accum:
if vw[1] > r:
print vw[0]
break
编辑: astynax 巧妙地指出,没有必要对权重进行排序,因为无论如何都会对累积概率列表进行排序。
所以我们只需要:
accum = ((k, sum(mychoice.values()[:i]))
for i, k in enumerate(mychoice.keys(), 1))
然后生成一个随机值,并以与之前相同的方式得到结果。