js實現一個按照權重抽獎函數

使用方式

1 先配置獎品數據,好比4個獎品類型,一等獎機率1%,二等獎機率3%,三等獎機率6%,參與獎90%,設置以下git

var model = [{
    name: '一等獎',
    key: 'level1',
    radio: 1,
},{
    name: '二等獎',
    key: 'level2',
    radio: 3,
},{
    name: '三等獎',
    key: 'level3',
    radio: 6,
},{
    name: '參與',
    key: 'level4',
    radio: 90
}]
複製代碼

配置好獎品後就能夠初始化抽獎函數,執行抽獎github

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….

相關文章
相關標籤/搜索