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]
    }
}

Отказ от ответственности: Как правило, лотерея не проводится на стойке регистрации, но ее можно использовать не только для лотереи, но и в играх или других случаях с более низкими требованиями безопасности.

Прикрепите адрес источника GitHubGitHub.com/холодный день/лот….