如何从Python列表中非均匀采样

时间:2019-03-24 16:44:23

标签: python-3.x random

请问您如何建议从具有确定概率的分布中抽样(或在下面更好地解决我的问题):

我有一个物品清单。我目前可以使用rand_word = randint(0, total_num)从中进行采样。但我希望列表中后面的元素出现的更多。

例如,我希望列表中前20%的项目以10%的概率出现,而后20%的可能性以50至60%的概率出现。 (尽管分布可能会更复杂。)

1 个答案:

答案 0 :(得分:0)

您的请求是开放式的,因此有无限数量的发行版可以满足您的要求。根据实际所需的发行版,实现方式可能会有很大差异。

也就是说,正确设置了参数的triangle distribution将从列表开头开始采样的频率较低,而从结尾开始则采样的频率较高。这是一个简单的实现:

from random import random
from math import sqrt

def sample_triangle(ary):
    return ary[int(len(ary) * sqrt(random()))]

取连续Uniform(0,1)的平方根会生成一个连续的三角随机变量,其最小值等于0,并且max和mode均等于1。将其乘以列表的长度并将其整数化将其转换为具有整数三角形分布的有效列表索引。

这是从包含数字1到20的列表中生成的10,000个值的示例运行的结果:

Histogram of generated triangle distribution.