js实现一个按照权重抽奖函数

本文介绍了 JavaScript 带权重抽奖算法的使用方式和实现原理。使用时先配置奖品数据,再初始化抽奖函数。实现时先按权重分解奖品数组,再打乱顺序,最后随机抽取一个作为中奖结果。该算法可用于游戏等安全性要求低的场合,还附上了源码地址。

使用方式

1 先配置奖品数据,比如4个奖品类型,一等奖概率1%,二等奖概率3%,三等奖概率6%,参与奖90%,设置如下

        
var model = [{
    name: '一等奖',
    key: 'level1',
    radio: 1,
},{
    name: '二等奖',
    key: 'level2',
    radio: 3,
},{
    name: '三等奖',
    key: 'level3',
    radio: 6,
},{
    name: '参与',
    key: 'level4',
    radio: 90
}]
复制代码

配置好奖品后就可以初始化抽奖函数,执行抽奖

var draw = new Draw(model);

var drawResult = draw.getResult();
复制代码

实现原理

拿到奖品数组,重新遍历,生成按照权重分解后的数组,如上面的例子,生成的新数组长度为100,一等奖数组中有一个,二等奖3个,以此类推
这样每个奖品在数组中的占比就跟权重保持一致了
按照权重分解是第一步,还需要将数组顺序打乱,这样更加随机性
生成完数组后,调用抽奖只是简单的从中随机取出一个,而这个就是中奖结果

核心代码如下

function Draw(prizes) {
    var prizeList = [] //按照权重分解后的奖品数组
    prizes.map(function(item){
        prizeList.push({
            name: item.name,
            value: item.key
        })
        for(var i=0; i< item.radio; i++) {
            prizeList.push({
                name: item.name,
                value: item.key
            })
        }
    });
    prizeList = reset(prizeList);
    // 范围随机数
    function randomFrom(lowerValue, upperValue) {
        return Math.floor(Math.random() * (upperValue - lowerValue + 1) + lowerValue);
    };
    // 随机打乱数组
    function reset(arr) {
        var eachArr = arr.concat([])
        var lastArr = []
        function deepEach(deepArr) {
            if (deepArr.length) {
                var randomIndex = randomFrom(0, eachArr.length - 1)
                lastArr.push(eachArr[randomIndex])
                eachArr.splice(randomIndex, 1) 
                deepEach(eachArr)
            }
        }
        deepEach(eachArr)
        return lastArr
    }
    this.getResult = function() {
        var random = randomFrom(0, prizeList.length - 1);
        return prizeList[random]
    }
}
复制代码
声明:一般抽奖不会放到前台去做,但是它不仅仅可以用来抽奖,还可以用在游戏或者其它安全性要求较低的场合

附上github源码地址github.com/ColdDay/lot….

转载于:https://juejin.im/post/5cf0804f518825332a1eff85

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值