当前位置:首页 > JavaScript

js实现一个权重抽奖

2026-04-05 01:46:41JavaScript

权重抽奖实现方法

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

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

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

    js实现一个权重抽奖

    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; } }

js实现一个权重抽奖

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]; }


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

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实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含…

js类实现

js类实现

使用类实现 JavaScript 功能 在 JavaScript 中,类(Class)是一种语法糖,基于原型继承机制。通过 class 关键字可以更直观地定义对象模板。 基本类定义 class…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…

js实现正交

js实现正交

正交的概念 正交在数学和计算机科学中通常指两个向量垂直或线性无关。在编程中,正交性常被用于设计模块化、低耦合的系统。 向量正交判断 判断两个向量是否正交可以通过点积是否为0来实现: fun…