【项目实战】 您所在的位置:网站首页 这个怎么抽奖 【项目实战】

【项目实战】

2024-01-25 01:59| 来源: 网络整理| 查看: 265

Java根据奖品权重计算中奖概率实现抽奖http://www.bieryun.com/1035.html

双蛋节(圣诞+元旦)刚刚过去,前几天项目上线的砸金蛋活动也圆满结束。

  现在在许多网站上都会有抽奖的活动,抽奖的算法也是多种多样,这里介绍一下如何根据每种奖品的权重来抽奖,适用于多种抽奖形式。、

这里写图片描述

奖品设置

  比如现在举行一次砸金蛋活动中,奖品如下:

这里写图片描述

  奖品够丰富的哇,香车美女豪宅都有了~不过由于法律的原因,活人是不能赠送的,所以一等奖只能送海报了~~这里写图片描述

  奖品在数据库中的存储情况

这里写图片描述

抽奖实现

  奖品实体 Prize.java

public class Prize { private int id;//奖品id private String prize_name;//奖品名称 private int prize_amount;//奖品(剩余)数量 private int prize_weight;//奖品权重 //getter、setter

  这里只考虑最简单的抽奖实现,所以暂时只为奖品设计如上4个字段。

  见注释,prize_name表示奖品名称;prize_amount表示奖品数量,即本次抽奖活动计划发放此奖品的数量;prize_weight表示奖品权重,表示奖品被抽到的几率的比重,权重越大,被抽到的几率越大,比如本次砸金蛋活动有4种奖品,权重分别是1、2、3、4,总权重是10,那么每种奖品被抽到的几率就是1/10,2/10,3/10,4/10。

  核心算法:

/** * 根据Math.random()产生一个double型的随机数,判断每个奖品出现的概率 * @param prizes * @return random:奖品列表prizes中的序列(prizes中的第random个就是抽中的奖品) */ public int getPrizeIndex(List prizes) { DecimalFormat df = new DecimalFormat("######0.00"); int random = -1; try{ //计算总权重 double sumWeight = 0; for(Prize p : prizes){ sumWeight += p.getPrize_weight(); } //产生随机数 double randomNumber; randomNumber = Math.random(); //根据随机数在所有奖品分布的区域并确定所抽奖品 double d1 = 0; double d2 = 0; for(int i=0;i= d1 && randomNumber


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有