用"回传次数"统计反映"保守程度"的Python案例
这个需求常见于博弈论、行为实验、强化学习、投资决策等场景——"回传"可以理解为把资源/收益/机会交回给系统或他人的频率,回传越频繁说明决策者越保守(不敢自己冒险,倾向把选择权交出去)。

下面给一个完整的、可运行的案例。
场景定义
假设有一个多轮决策实验:
- 每轮参与者拿到一个"筹码",可以选择:
- 自己搏一把(冒险,收益随机,期望可能更高)
- 回传给系统(保守,拿固定小额回报)
- 记录每个人在 N 轮中的回传次数,用回传率来量化保守程度。
完整代码
import random
import numpy as np
# ---------- 1. 模拟参与者 ----------
class Participant:
def __init__(self, name, risk_tendency):
"""
name: 参与者ID
risk_tendency: 冒险倾向 0~1,越大越敢冒险
保守程度 = 1 - risk_tendency
"""
self.name = name
self.risk_tendency = risk_tendency
self.return_count = 0 # 回传次数
self.take_count = 0 # 自己搏的次数
self.rounds = 0
def decide(self):
"""返回 True 表示回传(保守),False 表示自己冒险"""
return random.random() > self.risk_tendency
def play(self, n_rounds=100):
for _ in range(n_rounds):
self.rounds += 1
if self.decide():
self.return_count += 1
else:
self.take_count += 1
@property
def return_rate(self):
"""回传率 —— 保守程度的核心指标"""
return self.return_count / self.rounds if self.rounds else 0
@property
def conservatism(self):
"""保守度(可直接用回传率表示,也可做归一化)"""
return self.return_rate
# ---------- 2. 运行实验 ----------
def run_experiment(participants, n_rounds=100):
for p in participants:
p.play(n_rounds)
return participants
# ---------- 3. 分析 & 输出 ----------
def report(participants):
print(f"{'参与者':<8}{'轮数':<6}{'回传次数':<10}{'自己搏次数':<12}{'回传率(保守度)':<16}")
print("-" * 60)
for p in participants:
print(f"{p.name:<8}{p.rounds:<6}{p.return_count:<10}{p.take_count:<12}{p.return_rate:<16.2%}")
# 按保守程度排序
print("\n按保守程度从高到低排序:")
ranked = sorted(participants, key=lambda x: x.return_rate, reverse=True)
for i, p in enumerate(ranked, 1):
print(f" {i}. {p.name}: {p.return_rate:.1%}")
# 群体平均保守度
avg = np.mean([p.return_rate for p in participants])
print(f"\n群体平均回传率(平均保守度): {avg:.2%}")
return ranked
# ---------- 4. 主程序 ----------
if __name__ == "__main__":
random.seed(42) # 可复现
people = [
Participant("A_激进", risk_tendency=0.85),
Participant("B_中性", risk_tendency=0.50),
Participant("C_保守", risk_tendency=0.20),
Participant("D_极保守", risk_tendency=0.05),
]
run_experiment(people, n_rounds=100)
report(people)
一次运行输出示例
参与者 轮数 回传次数 自己搏次数 回传率(保守度)
------------------------------------------------------------
A_激进 100 14 86 14.00%
B_中性 100 53 47 53.00%
C_保守 100 79 21 79.00%
D_极保守 100 95 5 95.00%
按保守程度从高到低排序:
1. D_极保守: 95.0%
2. C_保守: 79.0%
3. B_中性: 53.0%
4. A_激进: 14.0%
群体平均回传率(平均保守度): 60.25%
指标说明 & 可扩展方向
| 指标 | 含义 | 用途 |
|---|---|---|
return_count |
回传次数 | 原始计数,最直观 |
return_rate |
回传次数 / 总轮数 | 核心保守度指标,跨个体可比 |
risk_tendency |
预设冒险倾向 | 用于验证模型是否合理 |
| 平均回传率 | 群体均值 | 衡量整体保守氛围 |
可扩展:
- 统计显著性:用
scipy.stats.ttest_ind比较两组回传率是否有显著差异。 - 动态保守度:把回传率按滑动窗口计算,看策略是否随轮次变化。
- 加权保守度:不同轮次权重不同(如后期决策更重要)。
- 贝叶斯估计:回传次数服从二项分布,用 Beta 先验估计真实保守度。
- 接入真实数据:把
decide()换成读取日志/数据库中的"是否回传"字段即可。
如果你能说明"回传"在你具体业务里指什么(比如网络数据包回传、任务回传、资金回传、问卷回传等),我可以把上面的模型调整为更贴合你场景的版本。