需求是这样的:又一个16个元素的数组,元素为10个蓝色,3个紫色,2个红色,1个金色,现在要求点击按钮从数组中随机抽一个颜色,同时要求,每个颜色的概率可以配置。
其实就是类似业务中的抽奖,看似10个奖品,其中一个是大奖,那为什么大奖的概率不是十分之一呢?
let blueOdds = 0.4 // 蓝色概率
let purpleOdds = 0.3 // 紫色概率
let redOdds = 0.2 // 红色概率
let goldOdds = 0.1 // 金色概率
let arr = ['蓝色','蓝色','蓝色','蓝色','蓝色','蓝色','蓝色','蓝色','蓝色','蓝色','紫色','紫色','紫色','红色','红色','金色']
// 定义一个根据概率从数组中随机选出一个颜色的函数
function pickRandomColor(arr) {
// 定义一个变量,存储随机数
let random = Math.random()
// 定义一个变量,存储选中的元素的下标
let index
// 根据概率判断选中哪个颜色
if (random < blueOdds) {
// 如果随机数小于0.4,选中蓝色
// 在数组中找到所有蓝色的下标
let blueIndices = []
for (let i = 0; i < arr.length; i++) {
if (arr[i].levelColor == '蓝色') {
blueIndices.push(i)
}
}
// 在蓝色的下标中随机选一个
index = blueIndices[Math.floor(Math.random() * blueIndices.length)]
} else if (random < blueOdds + purpleOdds) {
// 如果随机数在0.4到0.7之间,选中紫色
// 在数组中找到所有紫色的下标
let purpleIndices = []
for (let i = 0; i < arr.length; i++) {
if (arr[i].levelColor == '紫色') {
purpleIndices.push(i)
}
}
// 在紫色的下标中随机选一个
index = purpleIndices[Math.floor(Math.random() * purpleIndices.length)]
} else if (random < blueOdds + purpleOdds + redOdds) {
// 如果随机数在0.7到0.9之间,选中红色
// 在数组中找到所有红色的下标
let redIndices = []
for (let i = 0; i < arr.length; i++) {
if (arr[i].levelColor == '红色') {
redIndices.push(i)
}
}
// 在红色的下标中随机选一个
index = redIndices[Math.floor(Math.random() * redIndices.length)]
} else {
// 如果随机数大于等于0.9,选中金色
// 在数组中找到所有黄色的下标
let yellowIndices = []
for (let i = 0; i < arr.length; i++) {
if (arr[i].levelColor == '金色') {
yellowIndices.push(i)
}
}
// 在黄色的下标中随机选一个
index = yellowIndices[Math.floor(Math.random() * yellowIndices.length)]
}
return index
}