如何随机获取带概率的随机数?类似抽奖业务

该文章介绍了一个根据预设概率从包含不同颜色元素的数组中进行随机选择的抽奖算法。通过设定蓝色、紫色、红色和金色各自的概率,确保了大奖(金色)的概率不同于其在数组中的数量比例。算法通过查找各颜色对应的元素下标并按概率选取来实现。
摘要由CSDN通过智能技术生成

需求是这样的:又一个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
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值