两步概率抽取 - 结合概率加权函数和截断正态分布的抽取

Two step probability draw - Combine probability weighting function and a draw from a truncuated normal distribution

我想根据特定的概率函数用python抽取一个随机值(r):

该值应该是一个固定常数,概率为 (p),概率为 (1-p),该值是从区间 (a,b) 中的正态分布中随机抽取的。

从我的角度来看,该函数由两个绘制组成:

第一次抽取:概率加权函数,概率为 p 和 (1-p)。

第二次抽取:从区间 (a,b) 中的截断正态分布抽取。

f.e。 constant = 10; p = 0,3; 1-p = 0,7, a=5, b=15

我的想法是:

r = random.choices([constant,random.normal()], weights=(0.3, 0.7))

然而,它似乎不起作用,我不知道如何包括间隔 (a,b)。

您的想法是中肯的,但您没有正确处理正态分布。首先,如果您使用 import random,您的选择是 random.gauss(mu, sigma)random.normalvariate(mu, sigma)。没有 normal() 函数。其次,正态分布的范围是无限的。您可以指定分布的中心 mu 和分布的度量 sigma,这样约 95% 的结果将落在 mu ± 2*sigma 范围内。如果您确实需要限制范围,则需要编写自己的带有循环的函数以拒绝超出范围限制的值并重试。

这是一个展示您想法的工作示例:

import random

constant = -42
mu = 10
sigma = 2
for _ in range(10):
    r = random.choices((constant,random.gauss(mu, sigma)), weights=(0.3, 0.7))
    print(r)

对于 musigma 的这些值,[5, 15] 范围之外的结果将很少见,但肯定仍然会发生。

这会产生如下结果:

[7.674159248587632]
[-42]
[7.818652194185853]
[-42]
[7.418414458386396]
[11.855000252151326]
[12.398753049340957]
[9.663097201849096]
[-42]
[10.385663464672415]

如果您不喜欢括号,print(r[0])