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开始遍历
simulated_months,因为第一个月份的样本已经在初始化时添加,避免重复生成 - 完整的样本生成逻辑:对于
simulated_months[x] == 0的情况,无论前面有多少连续的1,都会生成并添加样本,不会出现缺失 - 索引边界检查:添加
x - months_number >= 0的条件,防止访问负索引导致的逻辑错误 - 简化计算逻辑:直接统计连续促销期的数量,逻辑更清晰易懂
修复后,生成的样本数量会严格等于num_months参数值。
内容的提问来源于stack exchange,提问作者hanindul
相关产品推荐
相关产品推荐

