如果您想要连续分布,您可以获得最小值和最大值之间的任何浮点值,一种可能性是三角分布 https://en.wikipedia.org/wiki/Triangular_distribution其均值等于(min+max+mode)/3
。给定平均值、最小值和最大值,这意味着您需要mode = 3 * mean - min - max
。这产生mode = 17
对于你的问题。Numpy 提供了三角分布生成器 https://numpy.org/doc/stable/reference/random/generated/numpy.random.Generator.triangular.html#numpy.random.Generator.triangular.
如果您想要一个离散分布,其中结果都是整数,您可以考虑二项分布 https://en.wikipedia.org/wiki/Binomial_distribution随着变速。二项式分布有参数n
and p
,范围为{0,...,n}
平均值等于n*p
。由于您希望最小值为 12,最大值为 40,因此您需要通过减去最小值来移动所有目标值。您将生成一个二项式n = max - min = 28
和一个平均值23 - 12 = 11
。那需要28 * p = 11
, or p = 11/28
。通过添加最小值将结果移回您想要的范围来生成最终结果,即X = binomial(n = 28, p = 11/28) + 12
.
您在评论中说您想在 python 中执行此操作,因此这里有一些代码说明了这两个发行版:
import numpy as np
rng = np.random.default_rng()
sample_size = 30
min, max = 12, 40
# Triangular
mode = 17
print(rng.triangular(min, mode, max, sample_size))
# Binomial
n, p = 28, 11/28 # number of trials, probability of each trial
print(rng.binomial(n, p, sample_size) + 12)
请注意,范围限制是有保证的,但对于这两种情况,接近范围极值的值都极其罕见。如果您想要更多地出现最小值和最大值,则需要挖掘具有“更胖”尾部的有界分布。实现此目的的一种方法是生成混合分布,例如翻转加权硬币以从三角形或均匀分布生成。由于统一的均值处于中间范围 (26),因此如果您使用 50/50 权重,则这需要您将二项式或三角形的均值调整为 20,以便产生 23 的总体目标均值。例如,要获得二项式和离散制服的混合:
sample_size = 30
min, max = 12, 40
n, p = 28, 8/28 # adjust p to get mean of 20 after shifting by 12
binom = rng.binomial(n, p, sample_size // 2) + 12
unif = rng.integers(min, high = max + 1, size = sample_size // 2)
pooled = np.concatenate((binom, unif))
rng.shuffle(pooled)
print(pooled)