首页 > 解决方案 > 从列表中随机选择一个元素,但元素越低,被选中的机会越大

问题描述

我想从列表中随机选择一个项目。但不同的是,列表中的元素拥有的索引越高,它被选中的可能性就越大。在列表中随机选择一个项目后,我想将该项目存储到一个名为link.

我没有尝试很多不同的方法,因为我不知道从哪里开始。但这就是我目前拥有的:

import random

# A list of Youtube links ( I won't show the YT links )
links = ['link1 :D',
         'link2 :D',
         'link3 :D'
]

link = random.choice(links)

使用上面的代码,我只能从变量中的项目中获得随机(或伪随机)结果links。我如何编写代码以便它有更高的选择(但仍然是随机的)具有更大索引的项目?

如果我不清楚,这里有一个例子:

# List of 3 links

links = ['link1', # index: 0
'link2', # index: 1
'link3' # index: 2]

由于link3它的最高索引为 2,因此它被随机选择器选中的可能性最高。link2具有第二高的指数,因此它被选中的机会比 多link1,但被选中的机会比 少link3

标签: python-3.xrandom

解决方案


Python 3.6中的新功能。对于以前的 Python 版本,请参见此处

您可以使用weightscum_weights参数random.choices()根据相对权重进行选择。

由于您希望对较高索引处的元素的选择进行较大更改,因此您可以使权重索引基于。

weights = [i for i in range(1, len(links) + 1)]

在内部,在进行选择之前,相对权重 ( weights) 会转换为累积权重 ( )。cum_weights

random.choices(links, weights=weights)

注意:如果weights提供了一个序列,它必须与样本序列的长度相同。


推荐阅读