Javascript如何实现按数组预设概率分配指定数量额度
按固定概率分配额度的最优实现方案
无需复杂判断和大量计算的最优实现是带权重的随机抽样统计,底层对应多项分布的单次抽样,实现逻辑非常简洁:
实现步骤
- 第一步:整理档位和对应权重,无需做百分比换算,直接用原始数值即可:
level_list = ["easy", "medium", "hard", "very hard"] weight_list = [85, 10, 3, 2] - 第二步:调用编程语言内置的带权重随机抽样接口,抽取和待分配额度总数相等的样本。以Python为例仅需一行代码:
import random # k参数传入要分配的额度总数量,比如示例中的10 sample_result = random.choices(level_list, weights=weight_list, k=10) - 第三步:统计每个档位在抽样结果中的出现次数,即为该档位最终分配到的额度数量。
统计示例结果:
完全符合你给出的示例预期。easy: 8 medium: 2 hard: 0 very hard: 0
手动实现底层逻辑的极简方案
如果不想依赖编程语言的内置抽样接口,用累积区间映射法实现也没有复杂逻辑,不需要大量if判断:
- 先把权重转换为左闭右开的累积区间:上述权重对应区间为
[0,85)、[85,95)、[95,98)、[98,100) - 每分配1份额度时,生成1个0-100的随机整数,匹配落入的区间对应档位即可。因为档位数量极少,即使遍历匹配的成本也可以完全忽略。
对应数学模型
该需求的本质是符合参数为(总分配数N, 各档位概率p1,p2...pn)的多项分布,你需要的结果就是该分布的一次随机抽样结果,不需要手动推导复杂公式,直接用上述工程方案即可高效实现。
内容的提问来源于stack exchange,提问作者user3465632
相关产品推荐
相关产品推荐

