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

simulate_demand函数样本数量异常:请求10000+仅返回9000+

样本数量不足的问题分析与修复

问题根源

你的simulate_demand函数生成的样本数量少于设定的num_months,核心问题出在**simulated_months[x] == 0的分支逻辑不完整**:

  • 当simulated_months[x] == 1时,每次都会执行append生成样本
  • 当simulated_months[x] == 0时,只有在while循环中恰好找到simulated_months[x-months_number] == 0的情况才会添加样本;如果前面连续都是1(直到列表开头),或者遍历中没碰到0,就会直接跳过,导致样本缺失

另外代码还存在索引越界风险:当x-months_number小于0时,Python会访问列表的负索引(从末尾倒数),完全偏离了“寻找上一次非促销期(0)”的逻辑,可能引发计算错误甚至无限循环。

修复后的代码

重新梳理逻辑,确保每个月份都对应一个样本,同时修正索引问题:

def simulate_demand(num_months):
    simulated_months = [0]
    for _ in range(num_months - 1):
        simulated_months.append(rng.choice([1, 0], p=[0.7, 0.3]))

    simulated_months_distribution = [rng.normal(800, 150)]  # 对应第一个月份的样本

    # 从索引1开始遍历,避免重复处理已初始化的第一个月份
    for x in range(1, len(simulated_months)):
        if simulated_months[x] == 1:
            simulated_months_distribution.append(rng.normal(500, 100))
        elif simulated_months[x] == 0:
            t = 0
            months_number = 1
            # 向前遍历统计连续促销期(1)的数量,同时避免索引越界
            while x - months_number >= 0 and simulated_months[x - months_number] == 1:
                t += 1
                months_number += 1
            # 无论连续促销期数量是多少,都生成对应样本
            simulated_months_distribution.append(rng.normal(800 + (100 * t), 150))
    
    simulated_months_distribution_df = pd.DataFrame(simulated_months_distribution)
    simulated_months_distribution_df.plot(style='r--', figsize=(20, 10))
    return simulated_months_distribution_df

关键修复说明

  1. 遍历范围调整:从索引1开始遍历simulated_months,因为第一个月份的样本已经在初始化时添加,避免重复生成
  2. 完整的样本生成逻辑:对于simulated_months[x] == 0的情况,无论前面有多少连续的1,都会生成并添加样本,不会出现缺失
  3. 索引边界检查:添加x - months_number >= 0的条件,防止访问负索引导致的逻辑错误
  4. 简化计算逻辑:直接统计连续促销期的数量,逻辑更清晰易懂

修复后,生成的样本数量会严格等于num_months参数值。

内容的提问来源于stack exchange,提问作者hanindul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:00:50