在实际应用中可能你会碰到抽奖系统,或者有个广告位让你按权重进行显示。概率性的东西,要用到随机函数Math.random()。
某物品的概率 = 自身权重/总权重,为了避免浮点数精度问题,我们将概率转化为权重进行计算,自身权重 = 某物品的概率 * 总权重。所以随机抽取的物品为Math.random()* 总权重。
function roll(args){
let sum_weight = 0;
let result = null;
const items = args.slice().map(item => (sum_weight += item.weight) && item); // 计算总权重
const random = Math.ceil(Math.random() * sum_weight); // 随机抽取的物品位置
let start = 0; // 区间的开始,第一个是为0
while (items.length) {
const item = items.shift(); // 取出第一个商品
const end = start + item.weight; // 计算区间的结束
if (random > start && random <= end) { // 如果随机数在这个区间内,说明抽中了该商品,终止循环
result = item;
break;
}
start = end; // 当前区间的结束,作为下一个区间的开始
}
return result ? result.item : null;
}
本文介绍了一种基于权重的随机抽取算法实现,通过将概率转换为权重来避免浮点数精度问题,确保每个元素被抽中的概率与其设定的权重成正比。
抽取(显示)&spm=1001.2101.3001.5002&articleId=79442752&d=1&t=3&u=6efb238b1b6f440ba75a3b1478c9ee49)
418

被折叠的 条评论
为什么被折叠?



