基于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滑动峰值位置并压缩低稀有度区间,自然实现概率此消彼长。
实现步骤
- 给稀有度分配数值标签:r1→1,r2→2,...,rn→n
- 根据t计算目标峰值位置
μ,控制曲线中心 - 随t增大缩小方差
σ,让曲线更尖锐,降低低稀有度的概率占比 - 通过正态分布累积分布函数(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动态调整:提升峰值稀有度权重,按比例衰减低稀有度权重,逻辑直观易调试。
实现步骤
- 定义基础权重(如r1=100,r2=50,r3=25...,可自定义)
- 根据t确定峰值稀有度
k - 对低稀有度(i < k)按距离k的层级衰减权重,对峰值稀有度(i=k)随t提升权重,高稀有度(i > k)轻微提升
- 用调整后的权重执行加权随机选择
伪代码实现
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"
优化建议
- 将概率配置(如基础权重、衰减因子)放在外部JSON文件中,无需改代码即可调整掉落曲线
- 用蒙特卡洛模拟(如生成10000次掉落)统计各t值下的稀有度占比,验证是否符合预期
- 若稀有度数量较多(n≥5),优先选择正态分布方案,无需手动配置每个稀有度的权重
内容的提问来源于stack exchange,提问作者BushV1per
相关产品推荐
相关产品推荐

