📜  在Python中以不同的概率从 List 中选择元素(1)

📅  最后修改于: 2023-12-03 14:51:19.146000             🧑  作者: Mango

在Python中以不同的概率从 List 中选择元素

在 Python 中,有时我们需要从一个 List 中随机选择一个元素,而且不同的元素被选择的概率是不同的。

比如,我们有一个 List 包含三个元素 ['A', 'B', 'C'],现在需要随机选择一个元素,但是选择 'A' 的概率是 50%,选择 'B' 的概率是 30%,选择 'C' 的概率是 20%。

如何实现这个随机选择的功能呢?

本文将介绍三种不同的方法,分别是:

  1. 使用 random.choices() 函数
  2. 使用 numpy.random.choice() 函数
  3. 自己实现随机选择算法
使用 random.choices() 函数

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() 函数

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 中选择元素的功能,选择哪种方法取决于你的需求和习惯。