二倍均值法计算红包金额

在日常 Java 开发中,业务上可能会遇到一些拉新引流的相关需求,比如:发放红包、签到领现金等(这里以发放红包为例)。

那么就会面临一个问题:怎么保证红包在领取时,金额随机,且至少能领0.01元?

一般会有两种红包方案:

“拼手速”红包

我们假设有一个100元的红包。第一个人可以在0.01元到100元之间,随机地分配到一定金额。
如果我们把第一个人抽到的所有可能的金额都计算在内,并取个平均值,那么他平均能获得50元。
这50元在数学上还有个形象的名字,叫作数学期望。
既然是“期望”,就总会有落空的时候,也不排除会有意外的惊喜。
因此,第一个人抽到的金额可能不足50元,也可能大于50元。

如上所述,虽然每一个人在抢红包时都是随机分配数额,貌似很公平,但总会有“先来后到”。

“雨露均沾”红包

        原理其实很简单,就是把每个人可能抽到的最高金额强行降低,即使你是第一个打开红包的人,也不允许你任意的从0.01到100元之间抽取金额。

        这时候就需要有个相对“公平”的算法来计算相应金额:二倍均值法

假设红包总金额是X,红包个数为Y,每个红包的最低金额是0.01元
那么每次抢到的红包金额的范围在 (0.01, (X/Y) *2) 之间。

即:每次运算时,在 0.01 ~ (剩余金额 / 剩余个数 * 2) 的范围内随机取值
也就是最大值为:0~100的随机值 / 100 * (剩余金额 / 剩余个数 * 2)

闲话少说,直接上示例代码:

public class ComputeRedPacketAmount {

    //二倍均值法:
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辛勤de小蜜蜂

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值