在 Python 中以不同概率从列表中选择元素


创建精确模拟的一个重要方面是能够以不同的概率从列表中选择元素。例如,在人群模拟中,某些动作可能比其他动作更有可能发生,或者在物理系统模拟中,粒子可能以不同的概率向不同的方向移动。

Python 提供了几种方法来以不同的概率从列表中选择元素。在本教程中,我们将探讨不同的技术来实现这一点,使用内置的 random 模块和 NumPy 模块。

以相等概率从列表中选择元素

让我们首先讨论如何以相等概率从列表中选择元素。random 模块提供了一个名为 choice() 的函数,该函数从列表中返回一个随机元素。

示例

以下是一个示例:

import random
my_list = [1, 2, 3, 4, 5]
random_element = random.choice(my_list)
print(random_element) 

输出

3

在此示例中,我们导入 random 模块并定义一个名为 my_list 的列表。然后,我们使用 choice() 函数从 my_list 中选择一个随机元素并将其分配给变量 random_element。最后,我们打印 random_element 的值。

以不同概率从列表中选择元素

现在让我们讨论如何以不同的概率从列表中选择元素。假设我们有一个元素列表,我们希望以不同的概率选择每个元素。我们可以使用 Python 中的 random.choices() 函数来实现。

random.choices() 函数接受三个参数:

  • 要从中选择的元素列表

  • 每个元素的概率列表

  • 要选择的元素数量(可选)

示例

以下是一个示例:

import random
my_list = [1, 2, 3, 4, 5]
my_probabilities = [0.1, 0.2, 0.3, 0.2, 0.2]
random_elements = random.choices(my_list, weights=my_probabilities, k=10)
print(random_elements) 

输出

上述代码的输出将是一个包含 10 个元素的列表,每个元素根据 my_probabilities 中指定的概率进行选择。

[2, 3, 2, 2, 4, 2, 5, 1, 4, 4] 

在此示例中,我们定义了一个名为 my_list 的列表,其中包含我们要从中选择的元素。我们还定义了一个名为 my_probabilities 的列表,其中包含每个元素的概率。所有概率的总和应等于 1。

然后,我们使用 random.choices() 函数根据 my_probabilities 中定义的概率从 my_list 中选择 10 个随机元素。weights 参数指定每个元素的概率分布,k 参数指定要选择的元素数量。

使用字典存储概率

在前面的示例中,我们在单独的列表中定义了每个元素的概率。但是,通常更方便地将概率存储在字典中。

示例

以下是一个示例:

import random
my_dict = {'a': 0.1, 'b': 0.2, 'c': 0.3, 'd': 0.2, 'e': 0.2}
random_elements = random.choices(list(my_dict.keys()),
weights=list(my_dict.values()), k=10)
print(random_elements) 

输出

['c', 'a', 'b', 'b', 'b', 'e', 'b', 'b', 'e', 'c'] 

在此示例中,我们定义了一个名为 my_dict 的字典,其中包含我们要从中选择的元素作为键,以及它们各自的概率作为值。然后,我们使用 random.choices() 函数根据字典值中定义的概率从字典的键中选择 10 个随机元素。

请注意,我们使用 list() 函数将字典的键和值转换为列表,因为 random.choices() 函数需要一个元素列表和一个权重列表。

使用 NumPy 模块生成随机概率

在前面的示例中,我们手动定义了每个元素的概率。但是,在许多情况下,我们可能希望生成随机概率。numpy 模块提供了各种用于生成随机数和数组的函数,包括用于生成随机概率的函数。

示例

以下是一个示例:

import random
import numpy as np
my_list = [1, 2, 3, 4, 5]
my_probabilities = np.random.dirichlet(np.ones(len(my_list)), size=1)[0]
random_elements = random.choices(my_list, weights=my_probabilities, k=10)
print(random_elements) 

输出

[1, 5, 1, 1, 1, 3, 3, 3, 5, 5] 

在此示例中,我们将 numpy 模块导入为 np 并定义一个名为 my_list 的列表,其中包含我们要从中选择的元素。然后,我们使用 numpy.random.dirichlet() 函数为 my_list 中的元素生成随机概率分布。

dirichlet() 函数接受两个参数:浓度参数和输出数组的大小。在本例中,我们将浓度参数设置为与 my_list 长度相同的全为 1 的数组,并将大小设置为 1 以获得一个一维概率数组。

然后,我们像以前一样使用 random.choices() 函数根据 my_probabilities 中定义的概率从 my_list 中选择 10 个随机元素。

结论

在本教程中,我们讨论了如何使用 random 模块在 Python 中以不同的概率从列表中选择元素。我们还讨论了如何使用 NumPy 模块生成随机概率。通过理解这些技术,您可以在 Python 程序中模拟概率事件并分析结果。

更新时间: 2024 年 2 月 22 日

1K+ 次浏览

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告