动态权重系统 ⚖️
更新: 8/15/2025, 12:55:22 PM 字数: 0 字 时长: 0 分钟
🎯 公平抽取-介绍
公平抽取是一种智能随机抽取方式,它通过动态权重算法确保每个成员被抽取的概率与其历史被抽中次数成反比,从而实现真正的公平性。
适用于课堂提问、任务分配、活动参与等需要公平随机选择的场景。
核心优势
- 智能平衡:避免频繁抽中同一学生
- 动态调整:权重随历史记录实时变化
- 多维度考量:综合总次数、小组、性别等因素
⚙️ 动态权重系统
动态权重系统是SecRandom实现公平抽取的核心引擎,通过5个关键维度计算每个成员的实时权重:
维度 | 作用 | 权重影响 |
---|---|---|
📊 总抽取次数 | 防止频繁抽中同一人 | 次数越多,权重越低 |
👥 小组平衡 | 确保各小组机会均等 | 小组被抽次数影响权重 |
⚧️ 性别平衡 | 保持性别比例平衡 | 性别被抽次数影响权重 |
🎯 基础权重 | 提供基础公平性 | 固定基础分值 |
🆕 冷启动保护 | 保护新加入成员 | 前10次抽取权重保护 |
🔍 算法逻辑详解
📈 权重计算公式
系统基于历史记录数据,通过以下5步计算得出最终权重:
1️⃣ 频率惩罚因子
基于个人总抽取次数的权重调整:
python
frequency_factor = 1.0 / math.sqrt(student_history["total_number_of_times"] * 2 + 1)
示例计算:
- 学生A被抽取5次 →
1/√(5*2+1) = 1/√11 ≈ 0.302
- 权重值:0.302(数值越小表示被抽中概率越低)
2️⃣ 小组平衡因子
确保各小组机会均等:
python
group_factor = 1.0 / (group_history * 0.2 + 1)
触发条件:至少3个小组有被抽中记录
3️⃣ 性别平衡因子
保持性别比例平衡:
python
gender_factor = 1.0 / (gender_history * 0.2 + 1)
触发条件:至少2个性别有被抽中记录
4️⃣ 冷启动保护机制
保护新加入的学生:
python
if current_round < COLD_START_ROUNDS: # COLD_START_ROUNDS = 10
frequency_factor = min(0.8, frequency_factor)
保护效果:新学生前10次抽取享有最低0.8的权重保护
5️⃣ 最终权重合成
综合所有因子得出最终权重:
python
student_weights = {
'base': BASE_WEIGHT * 0.2, # 基础权重 (20%)
'frequency': frequency_factor * 3.0, # 频率惩罚 (60%)
'group': group_factor * 0.8, # 小组平衡 (10%)
'gender': gender_factor * 0.8 # 性别平衡 (10%)
}
权重范围
最终权重值会被规范到合理区间,防止极端值影响公平性
📊 实际应用效果
场景示例
假设班级有30名学生,其中:
- 小明已被抽中15次(高频)
- 小红被抽中3次(中频)
- 小刚是新同学(冷启动)
权重对比:
- 小明:低权重(频率惩罚显著)
- 小红:中等权重(正常水平)
- 小刚:受保护权重(冷启动机制)
🎲 抽取概率
系统根据实时权重计算抽取概率,确保长期统计下的公平性。