精准高效生成区间正态分布随机数
在许多数据模拟和统计分析场景中,我们需要生成服从正态分布,且限定在特定范围内的随机数。例如,生成介于0到1之间,并符合正态分布的随机数。直接使用numpy.random.normal
函数无法满足这一需求。本文将介绍一种高效的解决方案。
简单的循环生成方法虽然直观,但效率低下,尤其当目标区间较小时,程序运行时间会显著增加。
更优的方案是利用scipy.stats.truncnorm
函数。该函数能够生成截断正态分布随机数,即只保留落在指定范围内的随机数,从而避免了低效的循环筛选。
以下代码演示如何使用scipy.stats.truncnorm
函数生成0到1之间的正态分布随机数:
import matplotlib.pyplot as plt import scipy.stats as stats # 定义区间上下限和正态分布参数 lower, upper = 0, 1 mu, sigma = 0.5, 0.2 # 创建截断正态分布对象 X = stats.truncnorm((lower - mu) / sigma, (upper - mu) / sigma, loc=mu, scale=sigma) # 生成10000个随机数 samples = X.rvs(10000) # 绘制直方图 plt.hist(samples, bins=50) plt.xlabel("数值") plt.ylabel("频率") plt.title("截断正态分布 (0, 1)") plt.show()
代码首先设定区间上下限lower
、upper
,以及正态分布的均值mu
和标准差sigma
。stats.truncnorm
函数根据mu
、sigma
以及计算出的上下限对应的z-score,创建一个截断正态分布对象。rvs(10000)
方法生成10000个随机数,最后用直方图可视化结果。这种方法比循环丢弃法效率更高,且能更精确地控制生成的随机数分布。