搞了个抽奖活动,中大奖中的简直爽歪歪?
不过还是要偷偷告诉你:抽奖是有内幕的~~~(不能让领导看到,会被打?)
总在各种app上看到转盘抽奖,翻牌抽奖,每次抱着中最大奖的心,换来的都是未中奖的提示,可谓是竹篮打水一场空,屡战屡败,屡败屡战~
现在就聊聊中奖的事,搬好小板凳排队做好了?♂️??♂️??♂️????????????
一、实现思路(这个应该不难理解吧~)
每个奖品都有对应的中奖概率,先对所有奖品中奖概率求和
计算出每个奖品在0-1之间所占的区间块
随机产生0-1之间的随机数,随机数落在哪个区间,就是中奖哪个
例如现有以下奖品:
奖品A 中奖概率为 0.1
奖品B 中奖概率为 0.01
奖品C 中奖概率为 0.001
奖品D 中奖概率为 0.8
第一步:求出概率总和 0.1+0.01+0.001+0.8 = 0.911
第二步:计算每个奖品的所占区间块
奖品A: 0.1 / 0.911 = 0.1098
奖品B: (0.1+0.01)/ 0.911 = 0.1207
奖品C:(0.1+0.11+0.001)/ 0.911 = 0.1218
奖品D:(0.1+0.11+0.001+0.8)/ 0.911 = 1
则:
奖品A的所占区间为:0~0.1098
奖品B的所占区间为:0.1098~0.1207
奖品C的所占区间为:0.1207~0.1218
奖品D的所占区间为:0.1218~1
到此为止思路应该了解了,不过我要做的是这个的升级版
根据不同类型的人分别设置概率(emm~换句话说根据身份设置概率发放奖品)
特此说明一下:里面的概率10代表10%,可以精确到小数点后两位,比如 0.01%
二、干货如下
import lombok.Data;
import lombok.ToString;
/**
* @Author: yansf
* @Description:奖励实体
* @Date:Creat in 10:35 AM 2019/1/16
* @Modified By:
*/
@Data
@ToString
public class RewardDto {
/**
* 奖品id
*/
private int welfareId;
/**
* 天天福利管理Id(Welfare_ManagerId)
*/
private int welfareMgrId;
/**
* 奖品名称
*/
private String welfareName;
/**
* 奖品类型(游戏币10 vip试用20 京东卡30)
*/
private int welfareType;
/**
* 奖品数量(单个奖品上限)
*/
private int AwardCount;
/**
* 奖品值
*/
private int welfareValue;
/**
* 奖品概率 (10代表10%)
*/
private int AwardPct;
/**
* 子概率-A类概率
*/
private int APct;
/**
* 子概率-B类概率
*/
private int BPct;
/**
* 子概率-C类概率
*/