Python Weibull分布随机数代码优化及离散分布采样咨询
问题1:700~1200区间Weibull分布随机数生成耗时优化
耗时核心原因
- 参数设置错误:
random.weibullvariate(alpha, beta)中第一个参数是尺度参数α,代表分布的特征位置,你设置α=0.6时,生成的随机值99%以上都小于1,几乎不可能落到700~1200区间,空转是耗时的核心原因 - 循环内每次执行
print(nums)属于IO操作,会额外拖慢运行效率 - 单步逐个生成、逐个判断的纯Python循环本身性能很低
优化方案
- 修正尺度参数:把α调整到目标区间的中心附近,比如设置为950,保证生成的随机值大部分落在目标区间范围
- 替换为numpy向量化操作:一次性生成批量随机数,统一过滤符合条件的结果,不足再补,效率比单步循环高100倍以上
- 移除循环内的打印操作,最终统一输出结果
优化后代码示例:
import numpy as np # 参数调整:scale设为950(匹配700~1200区间),shape保持0.4符合故障率分布特征 shape = 0.4 scale = 950 target_count = 100 low = 700 high = 1200 nums = [] while len(nums) < target_count: # 一次性生成200个样本(比目标数多,减少循环次数) samples = np.random.weibull(shape, size=200) * scale # 转整数后过滤区间 valid_samples = samples[(samples >= low) & (samples < high)].astype(int) nums.extend(valid_samples.tolist()) # 取恰好100个 nums = nums[:target_count] print(nums)
问题2:自定义离散Weibull分布的随机数生成
你给出的DiscreteWeibull(q, b, x)是该分布的概率质量函数(PMF),可以用逆变换采样法生成符合该分布的随机数,步骤如下:
- 预计算目标x范围内所有取值的PMF值,再累加得到累积分布函数(CDF)序列
- 生成一个[0, 1)区间的均匀随机数u
- 找到最小的x,使得CDF(x) ≥ u,该x就是符合分布的随机值
如果是批量生成,可以用numpy的向量化搜索进一步提升效率,示例代码如下:
import numpy as np def DiscreteWeibull(q, b, x): return q**(x**b) - q**((x + 1)**b) def gen_discrete_weibull(q, b, low, high, count=1): # 预计算所有目标x的PMF和CDF x_list = np.arange(low, high+1) pmf_list = DiscreteWeibull(q, b, x_list) # 区间样本归一化,保证CDF最终等于1 pmf_list = pmf_list / pmf_list.sum() cdf_list = np.cumsum(pmf_list) # 生成均匀随机数并匹配对应x us = np.random.random(size=count) return x_list[np.searchsorted(cdf_list, us)] # 示例:生成100个700~1200区间、q=0.9、b=0.4的离散Weibull随机数 samples = gen_discrete_weibull(q=0.9, b=0.4, low=700, high=1200, count=100) print(samples)
如果你的x没有上下限,可以设置足够大的右边界,只要保证右边界外的PMF之和小于1e-6,就不会影响生成精度。
内容的提问来源于stack exchange,提问作者mahmoudi hocine
相关产品推荐
相关产品推荐

