先上结果:
按照传闻的微信官方的抢红包算法,模拟 五个人,总共五块钱,重复抢100000次,平均下来,最后抢的那个人,抢到的红包为
下面上三种抢红包算法
方法一
0到总钱取随机值,然后总钱减去随机值,作为下次随机的总钱,以此类推,随机值即为抽到的红包数。
很明显,这种算法是不合适的
方法二(微信官方)
抽到的money=(0.01 + Math.random() *(总钱/ 目前人数x2))
这样的话,除了最后一个人之外,前面的人的红包大小概率都是均衡的,但是最后一个人就不一样,他有可能抽到前面的人抽不到的特大红包,但是他抽到小红包的概率会很大。
public void secondMethod(float totalMoney, int num) {
float money;
for (int i = 0; i < num; i++) {
if (i == num - 1) {
money = totalMoney;
} else {
money = (float) (0.01 + Math.random() * (totalMoney / (num - i) *