Python-加权版本的random.choice

我需要写一个加权版本的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

对于我来说,此功能似乎过于复杂且难看。我希望这里的每个人都可以提出一些改进建议或替代方法。对于我来说,效率并不像代码的清洁度和可读性那么重要。

回答:

从1.7.0版开始,NumPy具有choice支持概率分布的功能。

from numpy.random import choice

draw = choice(list_of_candidates, number_of_items_to_pick,

p=probability_distribution)

请注意,这probability_distribution是顺序相同的序列list_of_candidates。您还可以使用关键字replace=False来更改行为,以便不替换绘制的项目。

以上是 Python-加权版本的random.choice 的全部内容, 来源链接: utcz.com/qa/429784.html

回到顶部