天天福利抽奖-JAVA概率抽奖

搞了个抽奖活动,中大奖中的简直爽歪歪?

 

不过还是要偷偷告诉你:抽奖是有内幕的~~~(不能让领导看到,会被打?)

总在各种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类概率
     */
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值