隨機選擇的加權版本我需要編寫隨機選擇的加權版本(列表中的每個元素被選中的概率不同)。這就是我想出來的:def weightedChoice(choices):
"""Like random.choice, but each element can have a different chance of
being selected.
choices can be any iterable containing iterables with two items each.
Technically, they can have more than two items, the rest will just be
ignored. The first item is the thing being chosen, the second item is
its weight. The weights can be any numeric values, what matters is the
relative differences between them.
"""
space = {}
current = 0
for choice, weight in choices:
if weight > 0:
space[current] = choice
current += weight
rand = random.uniform(0, current)
for key in sorted(space.keys() + [current]):
if rand < key:
return choice
choice = space[key]
return None這個功能對我來說太復雜了,太丑了。我希望在座的每一個人都能提出一些改進的建議,或者其他的方法。對我來說,效率并不像代碼的整潔和可讀性那么重要。
3 回答

蠱毒傳說
TA貢獻1895條經驗 獲得超3個贊
def weighted_choice(choices): total = sum(w for c, w in choices) r = random.uniform(0, total) upto = 0 for c, w in choices: if upto + w >= r: return c upto += w assert False, "Shouldn't get here"
添加回答
舉報
0/150
提交
取消