你的问题也有其他选择。Wikipedia有一个continuous distributions with bounded intervals的列表,这取决于分布,您可以使用正确的参数获得所需的特性。例如,如果您想要类似“有界高斯铃”(不截断)的内容,可以选择(缩放的)beta distribution:import numpy as np

import scipy.stats

import matplotlib.pyplot as plt

def my_distribution(min_val, max_val, mean, std):

scale = max_val - min_val

location = min_val

# Mean and standard deviation of the unscaled beta distribution

unscaled_mean = (mean - min_val) / scale

unscaled_var = (std / scale) ** 2

# Computation of alpha and beta can be derived from mean and variance formulas

t = unscaled_mean / (1 - unscaled_mean)

beta = ((t / unscaled_var) - (t * t) - (2 * t) - 1) / ((t * t * t) + (3 * t * t) + (3 * t) + 1)

alpha = beta * t

# Not all parameters may produce a valid distribution

if alpha <= 0 or beta <= 0:

raise ValueError('Cannot create distribution for the given parameters.')

# Make scaled beta distribution with computed parameters

return scipy.stats.beta(alpha, beta, scale=scale, loc=location)

np.random.seed(100)

min_val = 1.5

max_val = 35

mean = 9.87

std = 3.1

my_dist = my_distribution(min_val, max_val, mean, std)

# Plot distribution PDF

x = np.linspace(min_val, max_val, 100)

plt.plot(x, my_dist.pdf(x))

# Stats

print('mean:', my_dist.mean(), 'std:', my_dist.std())

# Get a large sample to check bounds

sample = my_dist.rvs(size=100000)

print('min:', sample.min(), 'max:', sample.max())

输出:mean: 9.87 std: 3.100000000000001

min: 1.9290674232087306 max: 25.03903889816994

概率密度函数图:

注意,在这种情况下,并不是所有可能的界限、平均值和标准差的组合都会产生一个有效的分布,并且取决于alpha和beta的结果值,概率密度函数可能看起来像一个“倒钟”(即使平均值和标准差仍然是正确的)。

更多推荐

python的标准随机数生成器模块_Python:带均值和标准差的随机数生成器