如何使用numpy生成0~1区间内符合正态分布的随机小数
解决方法
标准正态分布本身的取值范围是*(-∞, +∞)*,你当前使用的参数(均值0.55,标准差0.2)下,数值小于0或者大于1的概率虽然低,但客观存在,所以直接调用np.random.normal必然会出现超出范围的结果。
下面提供两种常用解决方案,你可以根据自己的需求选择:
方案1:截断法(简单快捷,适合普通场景)
直接调用numpy内置的np.clip方法,把超出范围的数值强行限制在0到1之间,不需要额外引入依赖:
import numpy as np avg = 0.55 std_dev = 0.2 num_pop = 1000 # 生成随机数后截断到[0,1]区间 number = np.random.normal(avg, std_dev, num_pop).round(2) number = np.clip(number, a_min=0, a_max=1)
注意:这个方法会导致0和1这两个边界值的出现概率比真实截断正态分布略高,如果你的使用场景对数据分布的严谨性要求不高,这个方案完全够用。
方案2:生成严格的截断正态分布(适合统计相关的专业场景)
使用scipy.stats.truncnorm直接生成天然落在[0,1]区间内的正态分布随机数,完全符合截断后的分布统计特性,不会出现边界值堆积的问题:
import numpy as np from scipy.stats import truncnorm avg = 0.55 std_dev = 0.2 num_pop = 1000 # 计算截断上下限对应的标准分 lower_z = (0 - avg) / std_dev upper_z = (1 - avg) / std_dev # 直接生成截断正态分布随机数 number = truncnorm.rvs(lower_z, upper_z, loc=avg, scale=std_dev, size=num_pop).round(2)
内容的提问来源于stack exchange,提问作者Sara Lee
相关产品推荐
相关产品推荐

