使用Scipy uniform采样未得到均匀分布结果的问题排查
问题根源:
scipy.stats.uniform的参数理解错误 你犯了一个典型的参数使用错误:scipy.stats.uniform的第二个参数不是分布的上限,而是区间的长度(scale)。它的定义是uniform(loc, scale),其中:
loc:分布的起始点(下限)scale:分布区间的总长度
你当前的代码uniform(-np.pi, np.pi),实际定义的是从-np.pi开始、长度为np.pi的区间,也就是**[-π, 0]**,这就解释了为什么采样几乎全是负数,完全取不到大于0的值,导致你的while循环永远退不出来。
修正方案
要生成[-π, π]区间的均匀分布,区间长度是π - (-π) = 2π,所以需要把scale设为2*np.pi:
import numpy as np from scipy.stats import uniform # 正确定义:loc=-π,区间长度2π uni = uniform(-np.pi, 2 * np.pi) variables = uni.rvs(10)
运行修正后的代码,就能得到正负均匀分布的结果,示例输出:
>>> uni.rvs(10) array([ 1.124, -2.567, 0.689, -1.432, 2.876, -0.912, 3.001, -2.045, 0.798, -1.265 ])
此时你的while循环也能正常退出:
i=0 while i <=0.4: i = uni.rvs()
更直观的替代方案
如果觉得scipy的参数逻辑容易混淆,也可以直接用numpy的random.uniform,它的参数是low(下限)和high(上限),更符合直觉:
variables = np.random.uniform(-np.pi, np.pi, 10)
内容的提问来源于stack exchange,提问作者Pbro98
相关产品推荐
相关产品推荐

