Python 具有自定义概率分布的随机指数

Python 具有自定义概率分布的随机指数,python,numpy,random,distribution,Python,Numpy,Random,Distribution,我有一个概率向量(当然是和1): 现在我需要为这个向量生成一个随机索引(包括一个介于0和3之间的数字),但是我希望每个索引的概率由prob给出 0 will be generated with prob 0.1 1 will be generated with prob 0.3 2 will be generated with prob 0.4 3 will be generated with prob 0.2 我知道我可以通过计算总和来做到这一点 cumsum = [0.1, 0.4, 0.

我有一个概率向量(当然是和1):

现在我需要为这个向量生成一个随机索引(包括一个介于0和3之间的数字),但是我希望每个索引的概率由prob给出

0 will be generated with prob 0.1
1 will be generated with prob 0.3
2 will be generated with prob 0.4
3 will be generated with prob 0.2
我知道我可以通过计算总和来做到这一点

cumsum = [0.1, 0.4, 0.8, 1.0]
然后生成一个介于0和1之间的随机数:

rand_num = np.random.random()
最后使用
np.digitalize
检查我的随机数落在哪个箱子里

idx = np.digitize([rand_num], cumsum)
这是可行的,我对此很满意,Digitalize甚至接受一个数字列表并将它们分类到箱子中,这样我就可以创建自己的函数来生成给定概率分布的索引

我的问题是:这是一个常见的问题,难道不存在这样一个函数吗?(这将比我自己做更有效率)


谢谢

您可以使用Python 3.6中的
随机选项
,其中包括一个
权重
参数:

>>> from random import choices
>>> prob = [0.1, 0.3, 0.4, 0.2]
>>> choices(range(len(prob)), weights=prob)
[2]
>>> choices(range(len(prob)), weights=prob)
[3]
>>> choices(range(len(prob)), weights=prob, k=4)
[1, 2, 2, 2]
prob.find(rand_num)
>>> from random import choices
>>> prob = [0.1, 0.3, 0.4, 0.2]
>>> choices(range(len(prob)), weights=prob)
[2]
>>> choices(range(len(prob)), weights=prob)
[3]
>>> choices(range(len(prob)), weights=prob, k=4)
[1, 2, 2, 2]