当前位置: 首页 > 面试题库 >

用Python方式选择具有不同概率的列表元素

凌俊名
2023-03-14
问题内容

import random
pos = [“A”, “B”, “C”]
x = random.choice[“A”, “B”, “C”]

这段代码给我的概率是“ A”,“ B”或“ C”。当您想要“ A”的概率为30%,“ B”的概率为40%,“
C”的概率为30%时,有没有一种很好的表达方式?


问题答案:

权重定义概率分布函数(pdf)。任何此类pdf的随机数均可通过将其关联的逆累积分布函数应用于0到1之间的均匀随机数来生成。

另请参见以下SO解释,或者如Wikipedia所述:

如果Y具有U [0,1]分布,则F⁻(Y)作为F分布。这用于使用逆变换采样方法的随机数生成中。

import random
import bisect
import collections

def cdf(weights):
    total = sum(weights)
    result = []
    cumsum = 0
    for w in weights:
        cumsum += w
        result.append(cumsum / total)
    return result

def choice(population, weights):
    assert len(population) == len(weights)
    cdf_vals = cdf(weights)
    x = random.random()
    idx = bisect.bisect(cdf_vals, x)
    return population[idx]

weights=[0.3, 0.4, 0.3]
population = 'ABC'
counts = collections.defaultdict(int)
for i in range(10000):
    counts[choice(population, weights)] += 1
print(counts)

# % test.py
# defaultdict(<type 'int'>, {'A': 3066, 'C': 2964, 'B': 3970})

choice上述用途功能bisect.bisect,所以加权随机变量的选择是在完成O(log n)其中n是的长度weights

请注意,从1.7.0版开始,NumPy具有Cythonized
np.random.choice函数。例如,这从[0,1,2,3]具有权重的总体中生成1000个样本[0.1, 0.2, 0.3, 0.4]

import numpy as np
np.random.choice(4, 1000, p=[0.1, 0.2, 0.3, 0.4])

np.random.choice也有一个replace参数,可以选择是否进行替换。

理论上更好的算法是Alias方法。它会建立一个需要O(n)时间的表格,但此后可以及时绘制样本O(1)。因此,如果您需要绘制许多样本,则从理论上讲,别名方法可能会更快。有一个Python实现沃克别名方法在这里和这里numpy的版本。



 类似资料:
  • 比如说我有一张30000人的名单。我想从一组8种可能的水果中选择4次。然而,我希望任何名字选择任何水果两次的概率是20%。我将如何在代码中进行此操作。 例如:列出30000个水果名称: 苹果 香蕉 橙色 葡萄 猕猴桃 菠萝 西瓜 火龙果 我希望John选择苹果香蕉橙或苹果香蕉橙香蕉或龙果西瓜葡萄或葡萄猕猴桃的概率精确到20%。 换句话说,我希望80%的名字没有选择匹配的水果,20%的名字有一对匹配

  • 问题内容: 在SQL中,将行复制到另一个(备份)表中。如果备份表具有不同的结构(或不同的列名称),这可能吗?如果没有,实现此目标的最佳方法是什么? 这是我想做的:具有columns 。我想将一些行从该表复制到另一个具有column的表。内容进入,对等 问题答案: 该 列名 不事可言,只要该 数据类型 相匹配。 如果列的数据类型不匹配,请尝试相应地强制转换值。 只需尝试 使用小的虚拟表。确保明确列出

  • 让我们假设我有一个这样的结构化数组: 我将这个结构称为“categories”,所以,我在这个数组中有六个类别。我的目标是根据一个类别随机挑选一个产品。 我想做一个基于速率的类别选择,据我所知,我必须计算这个类别在数组中代表多少百分比,例如: 这会给我类似的东西: 好的,现在我要做一个简单的算法,根据这些比率得到类别;我想我现在需要在范围之间选择一个随机数,并制作一些“切片”,例如: 如果随机数介

  • 我有一个超过100列的表,我想编写一个选择查询,根据一列的不同条件从表中选择所有的列。 在上面的示例中,我想选择Col_A唯一的所有列(在源表中存在多个值的情况下首次出现)

  • 我已经添加了一个图像作为画布子级,该图像只是一个布局,以装备UI文本元素,如下图所示。 在这里,黑色的轮廓是图像,红色的轮廓是它们的边界,我们可以在编辑器中看到,蓝色的文本是用户界面文本元素,锚预设底部拉伸,右=100。画布渲染模式是屏幕叠加,按屏幕大小缩放,参考分辨率为1920x1080。因此,在图1中,用户界面文本在中间,但在图2(不同的分辨率)中,它看起来不像在中间。

  • 问题内容: 我正在尝试查询sybase服务器,以获取我们为测试目的而持有的不同类型数据的示例。 我有一张看起来像下面的表格(摘要) 正如我提到的那样,我想要每种类型的示例,因此对于上表,它需要一个类似的结果集(实际上,我只想要ID): 我尝试了以下查询的多种组合,但它们要么是无效的SQL(对于sybase),要么返回了无效的结果 您知道如何实现此查询吗? 问题答案: 也许您必须使用聚合函数或用于列