以等概率从多个列表中选取随机值

2024-10-01 15:38:41 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有3个列表

old_people = ['George', 'Bob', 'Owen']
young_people = ['Sarah', 'Gwen', 'Brittney']
mid_age = ['Larry', 'Missy', 'Greg']


import random
random.choice(old_people)

从一个列表中选择一个,我如何以相等的概率从三个列表中选择一个名字?在


Tags: 列表agerandompeopleoldbobmidyoung
3条回答

假设“从所有三个列表中以相等的概率选择一个名称”意味着每个名称都有相同的被选中的概率,因为在Python3.6中引入了^{},所以可以相对直接地完成这项工作,而不需要连接以构建一个巨大的列表。例如:

In [52]: seqs = [old_people, young_people, mid_age]

In [53]: random.choice(random.choices(seqs, weights=map(len, seqs))[0])
Out[53]: 'Larry'

在这里,我们使用长度选择一个列表来加权我们的选择,然后我们从这个列表中统一选择。seqs只生成对子列表的引用列表,因此不执行连接。在

作为对均匀性的检查:

^{pr2}$

如果所有名字组合起来的概率必须相等:

random.choice(old_people + young_people + mid_age)

这里需要注意的是,如果一个列表有更多的字符串,那么“list”被选中的概率就更高。在

如果概率需要使3个列表具有相等的概率被选中,并且在该列表中,每个字符串具有相同的概率,则它将更改为如下内容:

^{pr2}$

如果您不想产生将多个列表连接在一起的开销(在这种情况下,我不会责怪您—应该是O(1)操作的是O(n)),您可以通过选择与连接列表中某个位置相对应的索引来执行相同的操作,然后为相应的列表编制索引。代码:

import random

def choose(*lists):
    total_len = sum(map(len, lists))
    index = random.randrange(total_len)
    for l in lists:
        if index < len(l):
            return l[index]
        else:
            index = index - len(l)

它计算一个索引,然后遍历列表列表,直到找到它所属的那个,然后返回适当的元素。在

相关问题 更多 >

    热门问题