当前位置:首页 > JavaScript

js实现一个权重抽奖

2026-03-02 00:56:55JavaScript

js实现一个权重抽奖

权重抽奖实现方法

权重抽奖的核心是根据不同奖项的权重值计算概率,并通过随机数选择对应的奖项。以下是基于JavaScript的实现方法:

方法一:使用累积概率区间

function weightedDraw(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];
}

// 使用示例
const prizes = [
  { name: "一等奖", weight: 1 },
  { name: "二等奖", weight: 3 },
  { name: "三等奖", weight: 6 }
];
const result = weightedDraw(prizes);
console.log(result.name);

方法二:预计算概率表(适合高频调用)

class WeightedRandom {
  constructor(items) {
    this.total = items.reduce((sum, item) => sum + item.weight, 0);
    this.table = items.map(item => ({
      value: item.value,
      threshold: item.weight / this.total
    }));
    // 计算累积概率
    let accum = 0;
    this.table = this.table.map(item => {
      accum += item.threshold;
      return { ...item, accum };
    });
  }

  draw() {
    const random = Math.random();
    return this.table.find(item => random <= item.accum)?.value;
  }
}

// 使用示例
const wr = new WeightedRandom([
  { value: "黄金", weight: 10 },
  { value: "白银", weight: 30 },
  { value: "青铜", weight: 60 }
]);
console.log(wr.draw());

方法三:ES6优化版本

const weightedRandom = (items) => {
  const total = items.reduce((acc, { weight }) => acc + weight, 0);
  const rand = Math.random() * total;
  let sum = 0;

  return items.find(({ weight }) => (sum += weight) >= rand)?.item;
};

// 使用示例
const items = [
  { item: "iPhone", weight: 5 },
  { item: "iPad", weight: 15 },
  { item: "优惠券", weight: 80 }
];
console.log(weightedRandom(items));

关键点说明

  • 权重值可以是任意正数,不需要总和为1或100
  • 权重越大被抽中的概率越高
  • 算法时间复杂度为O(n),对于大量选项可考虑二分查找优化
  • 随机数生成使用Math.random(),如需更安全随机数可使用crypto.getRandomValues()

实际应用扩展

对于需要展示概率分布的场景,可先计算各奖项的实际概率:

function calculateProbabilities(prizes) {
  const total = prizes.reduce((sum, p) => sum + p.weight, 0);
  return prizes.map(p => ({
    ...p,
    probability: (p.weight / total * 100).toFixed(2) + '%'
  }));
}

以上实现可根据具体需求调整,如添加重复抽奖限制、奖品库存控制等功能。

js实现一个权重抽奖

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

相关文章

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在H…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标…

js实现视口

js实现视口

js实现视口检测的方法 使用JavaScript检测元素是否进入视口(viewport)可以通过Intersection Observer API或手动计算元素位置实现。以下是两种常见方法: Int…