如何在 Python 中实现加权随机选择?

2025年1月5日 | 阅读 4 分钟

许多编程任务需要根据加权概率随机选择选项。这在编码工作中很常见。Python 的 random 模块提供了生成随机数的函数,但本身不支持依赖权重的选择。不过,可以通过各种方法来完成此任务。

本文将通过示例和实现,介绍如何在 Python 中进行加权随机选择。

加权随机选择

但首先,我们需要了解什么是加权选择。加权随机选择是根据每个项目的概率从列表中或组中进行选择。每个部分都分配一个概率数字,然后从这些数字中随机选择部分。例如,如果你有一个项目列表,想让其中一个项目比其他项目有更高的选择几率,则需要为每个项目分配不同的权重。这会影响决策过程。

有几种方法可以从数字列表中获得加权随机选择:

  • 使用 Random 库的 choice()
  • 使用 numpy 库的 random.choice()
  • 自定义函数(用户定义的函数)

让我们深入探讨每种方法的解释及其实现。

1. random.choices()

Python 3.6 中引入的 random.choices 函数允许从总体中进行加权随机选择。这个内置函数允许你指定总体(元素列表)及其相应的权重。对于带有替换的单次和多次选择,它都是一个灵活而高效的选择。

此函数所需的库是 random 库。首先,我们需要导入该库,然后才能使用它来获得加权随机选择。

random.choice() 函数的语法

  • seq = 将从中获取随机加权选择的列表或元组。
  • weights = 这是一个可选参数,用于计算每个元素的概率。
  • cum_weights: 它用于计算每个元素的累积概率。
  • k = 表示返回列表的大小。

这是一个代表 random.choice() 函数用于获取随机加权选择的示例

输出

The Random choice is:  [36, 24, 47, 52, 47, 52, 47, 84, 36, 36]

首先,我们导入了库,然后创建了一个包含一些随机数的列表。接着,为每个元素分配了权重。权重列表的范围需要与因子的范围相似。然后,使用 random.choice() 函数,我们得到随机选择。由于 k 的值为 10,因此输出列表应包含 10 个元素。

我们可以添加累积权重来获得加权随机选择。下面是在 Python 中使用此方法的方法:

输出

The Random preference is: ['12', 22, '12', '12', 25]

在这里,我们使用了累积权重来获得加权随机选项。

我们也可以在不包含任何权重的情况下获得随机选项。

输出

The Random choice is:  [True]

2. numpy.random.choice()

这是另一种轻松获取加权随机选择的方法。numpy 库提供了 numpy.random.choice(),它从 numpy 数组中返回随机样本,用于一维数组因子。

numpy.random.choice() 方法的语法

d = 从中挑选随机选项的集合或行。

k 是输出列表的大小。

P = 它指定每个部分发生的概率。

输出

The Random choice of a coin is:  ['H' 'T' 'H' 'H' 'T']

在这里,我们使用了 numpy.Random.choice() 技术来获取硬币的随机选择。我们选择了 H 和 T 作为数据,以及一个随机的概率列表。

3. 自定义函数

我们可以创建用户定义的函数来获得加权随机选择。通过使用循环,我们可以为它们创建算法。它不需要任何外部库来实现。仅通过使用 Python 的基本功能和方法,我们就能获得加权随机选项。

下面是如何在 Python 中实现此方法:

输出

Weighted Random Choice: 63

这个特殊的函数 random_choice 接受一个选项列表及其关联的权重。它生成一个从 0 到权重总和的随机数,并使用运行总计来根据重要性确定选择哪个选项。

结论

在 Python 中,使用加权随机选择有助于以不同的概率选择元素。这对于游戏、模拟或从列表中选择信息非常重要。你可以使用 random.choices 或 numpy.random.choice 等内置函数来创建自己的 Python 解决方案,这对于此类工作非常有用。