按概率(权重)抽取(显示)

  在实际应用中可能你会碰到抽奖系统,或者有个广告位让你按权重进行显示。概率性的东西,要用到随机函数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;

}

你可能感兴趣的:(javascript)