前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >红包 | 教你使用 JAVA 抢红包,次次都是运气王

红包 | 教你使用 JAVA 抢红包,次次都是运气王

作者头像
码神联盟
发布2018-07-31 10:18:14
2.2K0
发布2018-07-31 10:18:14
举报
文章被收录于专栏:码神联盟

发红包不是我所擅长的技能,但是要说到抢红包,我敢说只要网速给力,剩下的,你就交给我好了

好了,接下来,我们来说下,Java是如何后台实现抢红包的功能的,附Demo,并且先来了解下红包的一些规则和算法,如下(随机拆分玩法):

1:每个红包金额不能小于0.01元 2:如果发送5个红包,则红包总金额不能小于0.01*5=0.05元 3:如果红包的个数大于1个,则每个红包的拆分金额不能等于红包总金额 4:每个红包拆分的金额之和,等于红包的总金额 5:要随机拆分,并且是没有任何顺序 6:显示运气王

代码如下:

代码语言:javascript
复制
/**
 * 抢红包逻辑代码
 * @author likang
 */
public class GrapRedEnvelope {
    public static void main(String[] args) {
        grapRed(10,6);
    }
    /**
     * 拆红包
     * @param price 红包总金额
     * @param person 红包个数
     */
    public static void grapRed(int price,int person){
        List<BigDecimal> moneys = math(BigDecimal.valueOf(price), person);
        if (moneys != null) {
            BigDecimal b = new BigDecimal(0);
            int num = 1;
            for (BigDecimal bigDecimal : moneys) {
                System.out.println("第" + num + "个人抢到:" + bigDecimal + "元    ");
                b = b.add(bigDecimal);
                num++;
            }
            for (int i = 0;i < moneys.size(); i++) {
                BigDecimal bigDecimal = moneys.get(i);
                if (bigDecimal == Collections.max(moneys)) {
                    System.out.println("运气王是第"+(i + 1)+"个人," + "金额最大值:" + Collections.max(moneys));
                }
            }
            System.out.println("红包总额:" + b + "元 ");
        }
    }
    /**
     * 计算每人获得红包金额;最小每人0.01元
     * @param redPrice  红包总额
     * @param number 人数
     * @return
     */
    public static List<BigDecimal> math(BigDecimal redPrice, int personNumber) {
        if (redPrice.doubleValue() < personNumber * 0.01) {//发红包最少0.01*personNumber
            return null;
        }
        Random random = new Random();
        // 将红包总金额换算为单位分
        int money = redPrice.multiply(BigDecimal.valueOf(100)).intValue();
        double count = 0;// 随机数总额
        // 每人获得随机点数
        double[] arrRandom = new double[personNumber];
        // 每人获得钱数
        List<BigDecimal> arrMoney = new ArrayList<BigDecimal>(personNumber);
        // 循环人数 随机点
        for (int i = 0; i < arrRandom.length; i++) {
            int r = random.nextInt((personNumber) * 99) + 1;
            count += r;
            arrRandom[i] = r;
        }
        // 计算每人拆红包获得金额
        int c = 0;
        for (int i = 0; i < arrRandom.length; i++) {
            // 每人获得随机数相加 计算每人占百分比
            Double x = new Double(arrRandom[i] / count);
            // 每人通过百分比获得金额
            int m = (int) Math.floor(x * money);
            // 如果获得 0 金额,则设置最小值 1分钱
            if (m == 0) {
                m = 1;
            }
            c += m;// 计算获得总额
            // 如果不是最后一个人则正常计算
            if (i < arrRandom.length - 1) {
                arrMoney.add(new BigDecimal(m).divide(new BigDecimal(100)));
            } else {
                // 如果是最后一个人,则把剩余的钱数给最后一个人
                arrMoney.add(new BigDecimal(money - c + m).divide(new BigDecimal(100)));
            }
        }
        // 随机打乱每人获得金额
        Collections.shuffle(arrMoney);
        return arrMoney;
    }
}

抢红包结果:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-06-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码神联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档