抢微信红包怎么手气最佳

先说点人话

  1. 先抢和后抢,抢到的红包的期望基本相同,就是从概率上来说抢到的钱是差不多的。
  2. 但是后抢的红包方差比较的大,就是有可能0.01, 也很有可能手气最佳

再说点相关的问题

下面信息由QCon某高可用架构群,WhyLiam 整理。

微信的金额什么时候算?

答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算。

就是在你打开红包的时候进行计算红包的金额,而不是预先分配好每个人多少。

分配:红包里的金额怎么算?为什么出现各个红包金额相差很大?

答:随机,额度在0.01和(剩余平均值*2)之间。

例如:发100块钱,总共10个红包,平均是10块钱一个,那么发出来的红包的额度在0.01元~20元之间。

但是,比如前面5个人,每个人都领了4元钱的红包。那么剩下就是 5个人可以领80元的红包,平均16元一个人,那么发出来的红包的额度在0.01~32元之间波动。所以很容易手气最佳。

有没有从数据上证明每个红包的概率是不是均等?

答:不是绝对均等,就是一个简单的拍脑袋算法。

会不会出现两个手气最佳?

答:会出现金额一样的,但是手气最佳只有一个,先抢到的那个手气最佳。

好,让我们开始测试

根据知情人数提供,以下代码仅供参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static double getRandomMoney(LeftMoneyPackage _leftMoneyPackage) {
// remainSize 剩余的红包数量
// remainMoney 剩余的钱
if (_leftMoneyPackage.remainSize == 1) {
_leftMoneyPackage.remainSize--;
return (double) Math.round(_leftMoneyPackage.remainMoney * 100) / 100;
}
Random r = new Random();
double min = 0.01; //
double max = _leftMoneyPackage.remainMoney / _leftMoneyPackage.remainSize * 2;
double money = r.nextDouble() * max;
money = money <= min ? 0.01: money;
money = Math.floor(money * 100) / 100;
_leftMoneyPackage.remainSize--;
_leftMoneyPackage.remainMoney -= money;
return money;
}

进行随机的数据测试,初始化数据(30人抢500块),执行了两次,结果如下:

1
2
// 第一次
15.69 21.18 24.11 30.85 0.74 20.85 2.96 13.43 11.12 24.87 1.86 19.62 5.97 29.33 3.05 26.94 18.69 34.47 9.4 29.83 5.17 24.67 17.09 29.96 6.77 5.79 0.34 23.89 40.44 0.92
1
2
// 第二次
10.44 18.01 17.01 21.07 11.87 4.78 30.14 32.05 16.68 20.34 12.94 27.98 9.31 17.97 12.93 28.75 12.1 12.77 7.54 10.87 4.16 25.36 26.89 5.73 11.59 23.91 17.77 15.85 23.42 9.77

对应图表如下:

继续2000次

可以看出大家抢到的红包其实是差不多的。

所以,有红包还是抓紧抢吧##

The Why·Liam·Blog by WhyLiam is licensed under a Creative Commons BY-NC-ND 4.0 International License.

WhyLiam创作并维护的Why·Liam·Blog采用创作共用保留署名-非商业-禁止演绎4.0国际许可证

本文首发于Why·Liam·Blog (https://blog.naaln.com),版权所有,侵权必究。

本文永久链接:https://blog.naaln.com/2017/01/get-lucy-envelope-on-wechat/