当前位置:首页 > JavaScript

js实现一个权重抽奖

2026-04-05 01:46:41JavaScript

权重抽奖实现方法

权重抽奖的核心是根据不同奖项的权重值随机抽取一个奖项。以下是使用JavaScript实现的几种方法:

方法一:基于数组和随机数

  1. 准备奖项及其权重数组

    const prizes = [
    { name: '一等奖', weight: 10 },
    { name: '二等奖', weight: 20 },
    { name: '三等奖', weight: 30 },
    { name: '参与奖', weight: 40 }
    ];
  2. 计算总权重并生成随机数

    
    function weightedRandom(prizes) {
    const totalWeight = prizes.reduce((sum, prize) => sum + prize.weight, 0);
    const random = Math.random() * totalWeight;

let currentWeight = 0; for (const prize of prizes) { currentWeight += prize.weight; if (random <= currentWeight) { return prize; } }

return prizes[prizes.length - 1]; // 默认返回最后一个 }


#### 方法二:使用概率分布

1. 预处理权重为累积概率
```javascript
function prepareWeights(prizes) {
  const totalWeight = prizes.reduce((sum, prize) => sum + prize.weight, 0);
  let cumulativeWeight = 0;

  return prizes.map(prize => {
    cumulativeWeight += prize.weight;
    return {
      ...prize,
      cumulativeWeight,
      probability: prize.weight / totalWeight
    };
  });
}
  1. 执行抽奖
    
    function drawPrize(preparedPrizes) {
    const random = Math.random() * preparedPrizes[preparedPrizes.length - 1].cumulativeWeight;

return preparedPrizes.find(prize => random <= prize.cumulativeWeight) || preparedPrizes[preparedPrizes.length - 1]; }

js实现一个权重抽奖


#### 方法三:优化版(适合大量奖项)

1. 使用二分查找提高效率
```javascript
function weightedRandomBinarySearch(prizes) {
  const cumulativeWeights = [];
  let sum = 0;

  for (const prize of prizes) {
    sum += prize.weight;
    cumulativeWeights.push(sum);
  }

  const random = Math.random() * sum;
  let left = 0;
  let right = cumulativeWeights.length - 1;

  while (left < right) {
    const mid = Math.floor((left + right) / 2);
    if (random > cumulativeWeights[mid]) {
      left = mid + 1;
    } else {
      right = mid;
    }
  }

  return prizes[left];
}

使用示例

const preparedPrizes = prepareWeights(prizes);
const result = drawPrize(preparedPrizes);
console.log(`恭喜获得:${result.name}`);

注意事项

  • 权重值可以是任意正数,不限于百分比
  • 确保权重总和不为零
  • 对于高频抽奖场景,建议预处理权重数据
  • 可根据需要添加奖项抽空后的处理逻辑

这些方法可根据实际需求进行调整,比如添加抽奖次数限制、奖项库存控制等功能。

标签: 权重js
分享给朋友:

相关文章

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现论坛

js实现论坛

实现论坛的基本功能 使用JavaScript实现一个论坛需要结合前端和后端技术。前端可以使用React、Vue或Angular等框架,后端可以选择Node.js配合Express或Koa框架。数据库可…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…