微信拼手气红包算法(二倍平均值法)实现示范代码

二倍平均值法

优势在于不需要先把每个人得多少算出来,只有拆红包的时候才会算出这个人得多少,减少实时算力
同时保证了每个人拼手气得到的平均值相同
设有10个人,红包总额100元。
100/10X2 = 20, 所以第一个人的随机范围是(0,20 ),平均可以抢到10元。
假设第一个人随机到10元,那么剩余金额是100-10 = 90 元。
90/9X2 = 20, 所以第二个人的随机范围同样是(0,20 ),平均可以抢到10元。
假设第二个人随机到10元,那么剩余金额是90-10 = 80 元。
80/8X2 = 20, 所以第三个人的随机范围同样是(0,20 ),平均可以抢到10元。
以此类推,每一次随机范围的均值是相等的。

  • 截图
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 代码

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Random;

/**
 * 微信拼手气红包算法(二倍平均值法)实现示范代码
 * @author humorchen
 */
public class RedPackage {
     Random random=new Random();
    /**
     * 每个红包最小金额
     */
     BigDecimal min=BigDecimal.valueOf(0.01);

    /**
     * 将小于1分钱的部分去掉
     * @param val
     * @return
     */
     public BigDecimal floor(BigDecimal val){
         return val.setScale(2,RoundingMode.FLOOR);
     }

    /**
     * 根据红包剩余金额和当前剩余红包数计算本次抢红包抢到了多少钱
     * @param lastMoney
     * @param lastPackage
     * @return
     */
    public   BigDecimal calculate(BigDecimal lastMoney,long lastPackage){
        if(lastPackage==1){
            return floor(lastMoney);
        }
        BigDecimal ret=floor(lastMoney.multiply(BigDecimal.valueOf(2*random.nextDouble()))).divide(BigDecimal.valueOf(lastPackage),3,RoundingMode.HALF_DOWN);
        if(ret.compareTo(min)==-1){
            return min;
        }
        ret=floor(ret);
        return ret;
    }

    /**
     * 给person个人发money元的拼手气红包
     * @param money
     * @param person
     */
    public  void sendRedPackage(BigDecimal money,int person){
        System.out.println(String.format("红包金额:%s,红包%d个",money.toString(),person));
        for (int i=0;i<person;i++){
            BigDecimal got=calculate(money,person-i);
            System.out.println(String.format("第%d个人拼手气得了%s",(i+1),got.toString()));
            money=money.subtract(got);
            System.out.println("红包结算后剩余"+money);
        }
    }
    public static void main(String[] args) {
        new RedPackage().sendRedPackage(BigDecimal.valueOf(0.04),4);
    }
}

  • 2
    点赞
  • 2
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:黑客帝国 设计师:我叫白小胖 返回首页
评论

打赏作者

HumoChen99

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值