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

本文介绍了一种基于权重的随机抽取算法实现,通过将概率转换为权重来避免浮点数精度问题,确保每个元素被抽中的概率与其设定的权重成正比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值