Как использовать
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]
}
}