在实际应用中可能你会碰到抽奖系统,或者有个广告位让你按权重进行显示。概率性的东西,要用到随机函数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;
}
版权声明:本文为tang_yi_原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。