如何在特定迭代次数后重启循环?10年实验模拟遇结果累积问题
问题分析与解决办法
你的核心问题是全局列表没在每次模拟前重置,加上内部逻辑错误修改了所有历史数据,才导致跨轮结果累积。具体问题点:
results1、expenses1、margins1是全局变量,每次模拟(sim循环)都往里面追加数据,没清空,所以第2次模拟的年份会接着第1次的10年之后继续计算。- 你在每个年份(yr循环)里遍历整个全局列表,修改的是所有历史数据,包括之前模拟的年份,完全打乱了每轮独立的逻辑。
iter变量在每次yr循环都被设为0,根本起不到控制迭代次数的作用。
修正后的代码逻辑
把每轮模拟的列表放到sim循环内部,保证每轮10年的数据独立;同时按年份顺序处理每轮内的逻辑,不用全局遍历:
import numpy as np import pandas as pd # 存储所有模拟的结果 all_simulations = [] for sim in range(5): # 每轮模拟初始化独立列表,避免跨轮累积 results = [] expenses = [] margins = [] for yr in range(10): # 初始化当年基础值 experiment = "Success" if np.random.random() <= 0.1 else "Failure" expense = 25000 margin = 0 # 根据上一年的结果修改当前年的值 if yr > 0: prev_result = results[yr-1] prev_expense = expenses[yr-1] prev_margin = margins[yr-1] # 上一年成功,当前年费用为0,初始利润10000 if prev_result == 'Success': expense = 0 margin = 10000 # 上一年费用为0,当前年费用继续为0 elif prev_expense == 0: expense = 0 # 上一年利润>=10000,当前年复利计算 if prev_margin >= 10000: margin = prev_margin * 1.2 # 将当前年数据加入本轮列表 results.append(experiment) expenses.append(expense) margins.append(margin) # 把本轮10年的数据整理成DataFrame,加入总列表 sim_df = pd.DataFrame({ "Simulation": sim+1, "Year": range(1, 11), "Results": results, "R&D": expenses, "Margins": margins }) all_simulations.append(sim_df) # 合并所有模拟结果 final_df = pd.concat(all_simulations, ignore_index=True) print(final_df)
关键改动说明
- 每轮模拟(sim循环)内部新建
results、expenses、margins,每轮结束后这些列表只包含当前轮的10年数据,不会和其他轮混淆。 - 处理年份逻辑时,只参考当前轮的上一年数据,不用遍历所有历史,逻辑更清晰,也不会修改其他轮的数据。
- 给每轮数据加上
Simulation和Year标识,方便后续分析每轮的独立结果。 - 去掉了无用的
iter变量,用yr循环直接控制10年的迭代。
这样修改后,每轮10年模拟都会独立运行,结束后自动重启下一轮,不会出现跨轮累积的问题,复利计算也只会在当前轮的年份内延续。
内容的提问来源于stack exchange,提问作者CantCodeAtAll
相关产品推荐
相关产品推荐

