随机选择的加权版本

随机选择的加权版本

我需要编写随机选择的加权版本(列表中的每个元素被选中的概率不同)。这就是我想出来的:

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

这个功能对我来说太复杂了,太丑了。我希望在座的每一个人都能提出一些改进的建议,或者其他的方法。对我来说,效率并不像代码的整洁和可读性那么重要。


达令说
浏览 586回答 3
3回答

DIEA

从1.7.0版本开始,NumPy有一个choice支持概率分布的函数。from&nbsp;numpy.random&nbsp;import&nbsp;choice draw&nbsp;=&nbsp;choice(list_of_candidates,&nbsp;number_of_items_to_pick, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p=probability_distribution)请注意probability_distribution是按同一顺序排列的序列。list_of_candidates..您也可以使用关键字replace=False若要更改行为,使绘制的项不被替换,请执行以下操作。

蛊毒传说

def&nbsp;weighted_choice(choices): &nbsp;&nbsp;&nbsp;total&nbsp;=&nbsp;sum(w&nbsp;for&nbsp;c,&nbsp;w&nbsp;in&nbsp;choices) &nbsp;&nbsp;&nbsp;r&nbsp;=&nbsp;random.uniform(0,&nbsp;total) &nbsp;&nbsp;&nbsp;upto&nbsp;=&nbsp;0 &nbsp;&nbsp;&nbsp;for&nbsp;c,&nbsp;w&nbsp;in&nbsp;choices: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;upto&nbsp;+&nbsp;w&nbsp;>=&nbsp;r: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;c &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upto&nbsp;+=&nbsp;w&nbsp;&nbsp;&nbsp;assert&nbsp;False,&nbsp;"Shouldn't&nbsp;get&nbsp;here"
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python