如何按照JSON中配置的百分比概率随机抽取对应等级
加权随机抽取等级实现方案
你给出的概率配置总和恰好为100%,可以直接使用累积区间法实现加权随机抽样,方案如下:
实现逻辑
- 提取
levels字段的所有等级与对应概率值,转换为键值对列表 - 计算每个等级对应的累积概率区间,每个区间采用左闭右开规则,区间长度等于对应等级的概率值
- 生成一个范围在
[0, 100)的随机浮点数 - 判断随机数落在哪个区间,返回对应区间的等级即可
提示:如果后续调整概率后总和不为100%,可以先将所有概率值求和得到总权重,再生成
[0, 总权重)范围的随机数进行匹配,不需要强制凑100%的总和。
代码示例
JavaScript 实现
// 你的配置数据 const config = { "fire": { "price": 25, "uniques": [23], "levels": { "1": 30, "2": 50, "3": 10, "4": 6.5, "5": 2.5, "6": 0.9, "7": 0.1 } } } function drawLevel() { const levels = config.fire.levels // 构建累积概率区间 let cumulative = 0 const ranges = Object.entries(levels).map(([level, prob]) => { const range = [cumulative, cumulative + prob, level] cumulative += prob return range }) // 生成0-100的随机浮点数 const random = Math.random() * 100 // 匹配对应区间返回等级 for (const [start, end, level] of ranges) { if (random >= start && random < end) { return parseInt(level) } } // 浮点精度边界兜底 return 7 } // 测试调用 console.log(drawLevel())
Python 实现
import random # 你的配置数据 config = { "fire": { "price": 25, "uniques": [23], "levels": { "1": 30, "2": 50, "3": 10, "4": 6.5, "5": 2.5, "6": 0.9, "7": 0.1 } } } def draw_level(): levels = config["fire"]["levels"] # 构建累积概率区间 cumulative = 0 ranges = [] for level, prob in levels.items(): ranges.append((cumulative, cumulative + prob, int(level))) cumulative += prob # 生成0-100的随机浮点数 random_num = random.uniform(0, 100) # 匹配对应区间返回等级 for start, end, level in ranges: if start <= random_num < end: return level # 浮点精度边界兜底 return 7 # 测试调用 print(draw_level())
效果验证
你可以批量调用抽取函数统计结果分布,正常情况下统计10000次的话,等级2出现占比接近50%、等级1占比接近30%,和配置的概率分布一致。
内容的提问来源于stack exchange,提问作者user9342273
相关产品推荐
相关产品推荐

