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

如何从PDF/PMF生成随机变量及停车场到达时间模拟问询

解决方案

1. numpy是否适合?

完全合适。numpy提供了丰富的随机分布生成函数,足够支撑停车场到达时间的模拟需求,配合scipy还能处理更复杂的分布场景。

2. 为什么Poisson分布结果过于集中?

Poisson分布的核心特性是方差等于均值,当你设置lam=35999时,方差也是35999,标准差仅约189,因此生成的数值必然集中在均值35999附近,无法满足你需要高方差的场景。

3. 推荐的替代分布及实现

(1)截断正态分布(单峰高方差)

如果希望保留10:00附近的峰值,同时增大数据分散度,可以使用正态分布,再将结果截断在0-86399的时间范围内。通过调整标准差控制方差大小:

import numpy as np

def generate_arrival_times():
    # 随机生成当日车辆数
    num_cars = np.random.randint(3, 20)
    # 均值设为10:00对应的秒数
    mean_time = 35999
    # 调整标准差控制方差,值越大数据越分散
    std_dev = 15000
    
    # 生成正态分布随机数,截断到合法时间范围后转为整数
    arrival_times = np.random.normal(loc=mean_time, scale=std_dev, size=num_cars)
    arrival_times = np.clip(arrival_times, 0, 86399).astype(int)
    
    return arrival_times.reshape(-1, 1)

# 测试生成4组数据
for _ in range(4):
    print(generate_arrival_times())

(2)混合分布(多峰值场景)

如果需要模拟早晚高峰这类多峰值的真实停车场景,可以手动实现混合分布:定义多个峰值(如早高峰7:00、午间10:00、晚高峰17:00),按权重随机分配车辆到不同峰值的分布中:

import numpy as np

def generate_mixed_arrival_times():
    num_cars = np.random.randint(3, 20)
    # 定义三个峰值对应的秒数:7:00、10:00、17:00
    peak_times = [25200, 35999, 61200]
    # 每个峰值对应的标准差,控制该峰的分散度
    peak_std = [5000, 8000, 6000]
    # 每个峰值的权重,调整占比模拟真实流量
    peak_weights = [0.35, 0.3, 0.35]
    
    # 随机为每辆车分配所属峰值
    peak_choices = np.random.choice(len(peak_times), size=num_cars, p=peak_weights)
    
    arrival_times = []
    for choice in peak_choices:
        t = np.random.normal(loc=peak_times[choice], scale=peak_std[choice])
        # 截断到合法时间范围
        arrival_times.append(np.clip(t, 0, 86399))
    
    return np.array(arrival_times).astype(int).reshape(-1, 1)

# 测试生成4组数据
for _ in range(4):
    print(generate_mixed_arrival_times())

4. 复合/混合Poisson变量的实现

Python(结合numpy和scipy)完全支持生成复合或混合Poisson变量:

  • 混合Poisson:可以像上面的混合分布示例一样,先随机选择Poisson分布的参数(如不同的lam值),再生成对应数值;
  • 复合Poisson:通常指Poisson计数过程加上其他分布的增量,比如在基础Poisson结果上叠加噪声,或者用Poisson生成事件数,再为每个事件生成对应数值:
from scipy.stats import poisson, norm
import numpy as np

def compound_poisson_arrival():
    num_cars = np.random.randint(3, 20)
    # 基础Poisson分布生成核心时间
    base_times = poisson.rvs(mu=35999, size=num_cars)
    # 叠加正态噪声增大方差
    noise = norm.rvs(loc=0, scale=10000, size=num_cars)
    arrival_times = base_times + noise
    
    return np.clip(arrival_times, 0, 86399).astype(int).reshape(-1, 1)

内容的提问来源于stack exchange,提问作者Luis Enriquez-Contreras

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:44:59