You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Weibull分布随机数代码优化及离散分布采样咨询

问题1:700~1200区间Weibull分布随机数生成耗时优化

耗时核心原因

  • 参数设置错误:random.weibullvariate(alpha, beta)中第一个参数是尺度参数α,代表分布的特征位置,你设置α=0.6时,生成的随机值99%以上都小于1,几乎不可能落到700~1200区间,空转是耗时的核心原因
  • 循环内每次执行print(nums)属于IO操作,会额外拖慢运行效率
  • 单步逐个生成、逐个判断的纯Python循环本身性能很低

优化方案

  1. 修正尺度参数:把α调整到目标区间的中心附近,比如设置为950,保证生成的随机值大部分落在目标区间范围
  2. 替换为numpy向量化操作:一次性生成批量随机数,统一过滤符合条件的结果,不足再补,效率比单步循环高100倍以上
  3. 移除循环内的打印操作,最终统一输出结果

优化后代码示例:

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),可以用逆变换采样法生成符合该分布的随机数,步骤如下:

  1. 预计算目标x范围内所有取值的PMF值,再累加得到累积分布函数(CDF)序列
  2. 生成一个[0, 1)区间的均匀随机数u
  3. 找到最小的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:54:05