跳转到内容

动态权重系统

更新: 8/6/2025, 4:47:02 AM  字数: 0 字  时长: 0 分钟

公平抽取-介绍

公平抽取是一种随机抽取方式,它确保每个成员被抽取的权重由系统决定,从而避免不公平的结果。 这种方式适用于需要随机且公平的抽取学生回答问题或进行其他需要公平分配的场景。 SecRandom的公平抽取的实现基于动态权重系统,通过多个方面来进行权重的计算。

动态权重系统

动态权重是SecRandom的公平抽取的核心机制。 它通过以下几个方面来计算每个成员的权重:

  • 总抽取次数(被抽中次数越多权重越低)
  • 抽取各小组次数
  • 抽取各性别次数
  • 基础权重
  • 冷启动(防止新学生权重过低)

背后的逻辑实现:动态权重系统的逻辑

(以下内容建立在有历史记录的情况下)

  1. 通过该学生抽取的总次数进行计算权重因子
    python
    frequency_factor = 1.0 / math.sqrt(student_history["total_number_of_times"] * 2 + 1)
  • 解释:1/[该学生被抽取的总次数]*2+1};例:该学生的被抽取的总次数为5次,则计算得:1.4
  1. 通过获取历史记录最底下的小组抽取次数进行计算权重因子(必须有3个小组的人被抽到才会计算,否则就为1)
    python
    group_factor = 1.0 / (group_history * 0.2 + 1)
  • 解释:1/[该小组被抽取的总次数]*0.2+1;例:该小组被抽取的总次数为15次,则计算得:1.0133...
  1. 通过获取历史记录最底下的性别抽取次数进行计算权重因子(必须有2个性别的人被抽到才会计算,否则就为1)
    python
    gender_factor = 1.0 / (gender_history * 0.2 + 1)
  • 解释:1/[该性别被抽取的总次数]*0.2+1;例:该小组被抽取的总次数为50次,则计算得:1.004
  1. 冷启动机制,为了防止新加入的学生还没被抽到10次所以会有这个保护机制
    python
    if current_round < COLD_START_ROUNDS:
    frequency_factor = min(0.8, frequency_factor)
  • 解释:当该学生抽到的轮数小于10轮则会进行最小为0.8限制计算
  1. 最终的数据处理,在进行这个计算前会执行以下计算,计算完成后会让该值处于一个范围区间内,以防止是值的过大或者过小
    python
    student_weights = {
        base': BASE_WEIGHT * 0.2,                    # 基础权重
        'frequency': frequency_factor * 3.0,          # 频率惩罚
        'group': group_factor * 0.8,                  # 小组平衡
        'gender': gender_factor * 0.8                # 性别平衡
    }

本文档以 MIT 许可协议授权