1.利用数组和Math.random()函数
let nameArr = [
{ name: '玩游戏', value: 80 },
{ name: '看电影', value: 25 },
{ name: '搞学习', value: 5 }
]
Array.prototype.sample = function () {
if (!this.length) return;
return this[~~(Math.random() * this.length)];
}
function random(list) {
let arr = []
list.forEach((e, i) => {
for (let index = 0; index < e.value; index++) {
arr.push(e.name)
}
})
let name = arr.sample()
return list.findIndex(item =>item.name == name)
};
let index = random(nameArr)
console.log(nameArr[index],index)//看电影 1
原理是按比例生成对应数量的数组 在数组里面随机抽取
2.利用区间大小判断对应的元素
let nameArr = [
{ name: '玩游戏', value: 50 },
{ name: '看电影', value: 25 },
{ name: '吃东西', value: 25 },
{ name: '搞学习', value: 10 }
]
let sum = nameArr.reduce((preVal, currVal) => preVal + currVal.value, 0);
let num = Math.random() * sum
let newArr = nameArr.sort((a, b) => a.value - b.value)
newArr.reduce((preVal, currVal) => {
console.log(preVal, currVal);
currVal.maxValue = preVal + currVal.value
return currVal.maxValue
}, 0);
let name = newArr.find(e => e.maxValue > num).name
console.log(num, name);// 34.05346723293404 '看电影'
欢迎各位大佬评论区补充更好的方法