📅  最后修改于: 2023-12-03 14:51:19.146000             🧑  作者: Mango
在 Python 中,有时我们需要从一个 List 中随机选择一个元素,而且不同的元素被选择的概率是不同的。
比如,我们有一个 List 包含三个元素 ['A', 'B', 'C'],现在需要随机选择一个元素,但是选择 'A' 的概率是 50%,选择 'B' 的概率是 30%,选择 'C' 的概率是 20%。
如何实现这个随机选择的功能呢?
本文将介绍三种不同的方法,分别是:
random.choices(population, weights=None, *, cum_weights=None, k=1)
这个函数可以从 population 中随机选择 k 个元素,每个元素被选中的概率可以通过 weights 参数指定。如果 weights=None,则每个元素被选中的概率相同。如果 weights 不为 None,则它必须是一个与 population 具有相同长度的列表或数组,其中每个元素都是一个正数,表示相应元素被选中的概率。
import random
population = ['A', 'B', 'C']
weights = [0.5, 0.3, 0.2]
result = random.choices(population, weights=weights)
print(result)
输出结果可能是:
['A']
numpy.random.choice(a, size=None, replace=True, p=None)
这个函数与 random.choices() 的功能类似,可以从 a 中随机选择元素,每个元素被选中的概率可以通过 p 参数指定。如果 p=None,则每个元素被选中的概率相同。如果 p 不为 None,则它必须是一个与 a 具有相同长度的列表或数组,其中每个元素都是一个非负数,并且它们的和必须为 1。
import numpy as np
a = ['A', 'B', 'C']
p = [0.5, 0.3, 0.2]
result = np.random.choice(a, size=1, p=p)
print(result)
输出结果可能是:
['B']
如果你不想使用 Python 自带的 random 或 numpy 库,可以自己实现随机选择算法。一个简单的方法是先计算出每个元素被选中的概率,然后使用随机数生成器生成一个 0 到 1 之间的随机数 r,然后逐个累加每个元素的概率,直到累加和大于等于 r,那么当前元素即为所选元素。
import random
def random_choice_with_probability(population, probability):
assert len(population) == len(probability)
r = random.uniform(0, sum(probability))
s = 0
for i in range(len(population)):
s += probability[i]
if s >= r:
return population[i]
return None
population = ['A', 'B', 'C']
probability = [0.5, 0.3, 0.2]
result = random_choice_with_probability(population, probability)
print(result)
输出结果可能是:
'A'
这三种方法都可以实现在 Python 中以不同的概率从 List 中选择元素的功能,选择哪种方法取决于你的需求和习惯。