我需要编写一个加权版本的 random.choice(列表中的每个元素都有不同的被选中概率)。这就是我想出的:
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
这个功能对我来说似乎过于复杂,而且很难看。我希望这里的每个人都可以提供一些改进建议或替代方法。效率对我来说不如代码整洁和可读性重要。
原文由 Colin 发布,翻译遵循 CC BY-SA 4.0 许可协议
从 1.7.0 版本开始,NumPy 有一个支持概率分布的
choice
函数。请注意,
probability_distribution
是与list_of_candidates
顺序相同的序列。您还可以使用关键字replace=False
来更改行为,以便不替换绘制的项目。