You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Luck值的进阶战利品掉落系统实现方案咨询

适配Luck系统的战利品掉落概率实现方案

核心需求梳理

先明确你的规则对应关系:

  • 有效Luck值 t = log10(luck) + 4(如0.001→1,0.01→2,0.1→3,1→4)
  • 稀有度对应峰值规则:t=1→r1,t=2-3→r2,t≥4→r3(每2级t提升一个峰值稀有度,可扩展至rn)
  • 核心逻辑:峰值稀有度概率随t提升而增加,低稀有度概率同步衰减

方案一:滑动正态分布区块(你提到的钟形曲线方案)

利用正态分布的集中特性,将稀有度映射到曲线区间,随t滑动峰值位置并压缩低稀有度区间,自然实现概率此消彼长。

实现步骤

  1. 给稀有度分配数值标签:r1→1,r2→2,...,rn→n
  2. 根据t计算目标峰值位置μ,控制曲线中心
  3. 随t增大缩小方差σ,让曲线更尖锐,降低低稀有度的概率占比
  4. 通过正态分布累积分布函数(CDF)计算每个稀有度的区间概率,再做加权随机选择

伪代码实现

import math
import random

def calculate_effective_luck(luck):
    return math.log10(luck) + 4

def get_peak_rarity(t, max_rarity):
    # 按规则映射t到峰值稀有度标签,可扩展至任意rn
    if t == 1:
        return 1
    elif 2 <= t <= 3:
        return 2
    else:
        # 每2级t提升一个稀有度,不超过最大稀有度
        return min(3 + ((t - 4) // 2), max_rarity)

def normal_cdf(x, mu, sigma):
    # 正态分布累积分布函数实现
    return 0.5 * (1 + math.erf((x - mu) / (sigma * math.sqrt(2))))

def generate_loot_rarity(luck, max_rarity):
    t = calculate_effective_luck(luck)
    mu = get_peak_rarity(t, max_rarity)
    # 方差随t增大而减小,最低保留0.6避免概率过于极端
    sigma = max(1.2 - 0.15 * (t - 1), 0.6)
    
    # 计算每个稀有度的区间概率
    probabilities = []
    for i in range(1, max_rarity + 1):
        lower_bound = i - 0.5
        upper_bound = i + 0.5
        prob = normal_cdf(upper_bound, mu, sigma) - normal_cdf(lower_bound, mu, sigma)
        probabilities.append(prob)
    
    # 归一化概率,解决浮点误差导致的总和偏差
    total_prob = sum(probabilities)
    probabilities = [p / total_prob for p in probabilities]
    
    # 加权随机选择稀有度
    rand_val = random.random()
    cumulative_prob = 0.0
    for idx, prob in enumerate(probabilities):
        cumulative_prob += prob
        if rand_val <= cumulative_prob:
            return f"r{idx + 1}"

方案二:动态加权概率调整(此消彼长逻辑)

通过给每个稀有度设置基础权重,随t动态调整:提升峰值稀有度权重,按比例衰减低稀有度权重,逻辑直观易调试。

实现步骤

  1. 定义基础权重(如r1=100,r2=50,r3=25...,可自定义)
  2. 根据t确定峰值稀有度k
  3. 对低稀有度(i < k)按距离k的层级衰减权重,对峰值稀有度(i=k)随t提升权重,高稀有度(i > k)轻微提升
  4. 用调整后的权重执行加权随机选择

伪代码实现

import random

def calculate_effective_luck(luck):
    return math.log10(luck) + 4

def get_peak_rarity(t, max_rarity):
    if t == 1:
        return 1
    elif 2 <= t <= 3:
        return 2
    else:
        return min(3 + ((t - 4) // 2), max_rarity)

def generate_loot_rarity_weighted(luck, max_rarity):
    t = calculate_effective_luck(luck)
    k = get_peak_rarity(t, max_rarity)
    
    # 基础权重:稀有度越高权重越低,可自定义
    base_weights = [100 / (2 ** i) for i in range(max_rarity)]
    
    adjusted_weights = []
    for i in range(1, max_rarity + 1):
        if i < k:
            # 低稀有度衰减:距离峰值越远,衰减倍数越高
            decay_factor = 0.7 ** (k - i)
            adjusted = base_weights[i-1] * decay_factor
        elif i == k:
            # 峰值稀有度权重提升:随t在当前区间内逐步增强
            if k == 1:
                boost_factor = 1.0
            elif k == 2:
                # t=2时1.5倍权重,t=3时2倍权重
                boost_factor = 1.5 + 0.5 * (t - 2)
            else:
                # k≥3时,每级t提升0.3倍权重
                boost_factor = 2.0 + 0.3 * (t - (2*k - 2))
            adjusted = base_weights[i-1] * boost_factor
        else:
            # 高稀有度轻微提升,保证有掉落可能
            boost_factor = 1 + 0.1 * (i - k)
            adjusted = base_weights[i-1] * boost_factor
        
        # 避免权重为0,保证低稀有度始终有概率
        adjusted_weights.append(max(adjusted, 1))
    
    # 加权随机选择
    total_weight = sum(adjusted_weights)
    rand_val = random.random() * total_weight
    cumulative_weight = 0.0
    for idx, weight in enumerate(adjusted_weights):
        cumulative_weight += weight
        if rand_val <= cumulative_weight:
            return f"r{idx + 1}"

方案三:模除思路的实现

通过生成固定范围的随机数,随t调整各稀有度的区间占比,直接实现概率此消彼长,适合简单稀有度体系。

实现逻辑(以n=3为例)

  • 生成0-99的随机数,按t划分区间:
    • t=1:0-79→r1(80%),80-94→r2(15%),95-99→r3(5%)
    • t=2:0-49→r1(50%),50-89→r2(40%),90-99→r3(10%)
    • t=3:0-29→r1(30%),30-84→r2(55%),85-99→r3(15%)
    • t=4:0-14→r1(15%),15-54→r2(40%),55-99→r3(45%)

伪代码实现

import random

def calculate_effective_luck(luck):
    return math.log10(luck) + 4

def generate_loot_rarity_mod(luck):
    t = calculate_effective_luck(luck)
    rand_val = random.randint(0, 99)
    
    if t == 1:
        if rand_val < 80:
            return "r1"
        elif rand_val < 95:
            return "r2"
        else:
            return "r3"
    elif 2 <= t <=3:
        # t=2时r1占50%,t=3时r1占30%
        r1_threshold = 80 - 30*(t-1)
        # t=2时r2占40%,t=3时r2占55%
        r2_threshold = r1_threshold + (15 + 25*(t-1))
        if rand_val < r1_threshold:
            return "r1"
        elif rand_val < r2_threshold:
            return "r2"
        else:
            return "r3"
    else:
        # t≥4时,r1占比逐步降低,r3占比逐步提升
        r1_threshold = max(15 -5*(t-4), 5)  # 最低保留5%概率
        r2_threshold = r1_threshold + max(40 -5*(t-4), 20)  # r2最低保留20%
        if rand_val < r1_threshold:
            return "r1"
        elif rand_val < r2_threshold:
            return "r2"
        else:
            return "r3"

优化建议

  1. 将概率配置(如基础权重、衰减因子)放在外部JSON文件中,无需改代码即可调整掉落曲线
  2. 用蒙特卡洛模拟(如生成10000次掉落)统计各t值下的稀有度占比,验证是否符合预期
  3. 若稀有度数量较多(n≥5),优先选择正态分布方案,无需手动配置每个稀有度的权重

内容的提问来源于stack exchange,提问作者BushV1per

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 02:26:09