之前,在网上看到一篇文章,说多人抢红包时,微信红包金额的分配规则是0.01元到当前剩余金额平均数的2倍(最后一个人金额为当前剩下的所有金额),所以写了一个python程序,模拟量一百万次,分析了一下抢微信红包的小技巧。
(所有结论都基于某篇文章所说的微信红包金额的分配规则,如果实际规则不是这样,那么以下分析就都是错的)
假设金额50元,有5个人抢,那么计算可得:
第1个人抢,他的金额区间就是[0.01,20](50除以5乘以2)
第2个人抢,他的金额区间就是[0.01,24.99]
第3个人抢,他的金额区间就是[0.01,33.32]
第4个人抢,他的金额区间就是[0.01,49.97]
第5个人抢,他的金额区间就是[0.01,49.96]
可以看到:越往后抢的,理论上能拿到的红包上限越高(虽然可能性很小,但理论上运气好还是能拿到的)
那是不是越往后拿的红包就普遍更大呢???
并不是!!!理论上限高,不代表平均值更大,通过100万次模拟数据统计加以分析,可以得到5人按先后顺序得到手气王的可能性分别为0.22, 0.2, 0.2, 0.19, 0.19,即在人数较少时,先抢后抢差异不大。,(但是当人数较多时,比如几十个人,则后抢手气最佳的可能性更大)
运行结果如下图:
***********************
第1个人
max:20.00 min:0.01
average:10.01
***********************
第2个人
max:24.99 min:0.01
average:10.00
***********************
第3个人
max:32.92 min:0.01
average:10.00
***********************
第4个人
max:47.88 min:0.01
average:10.00
***********************
第5个人
max:47.39 min:0.01
average:9.99
手气最佳概率分布: [0.22, 0.2, 0.2, 0.19, 0.19]
附上代码,大家可以自己运行一次试试。
from random import randint,random,uniform
import numpy as np
people = 5#人数
times = 1000000#模拟次数
luck = []
for i in range(people):
luck.append([])
for i in range(times):
money = 50
for j in range(people):
if(j == people - 1):#最后一个人金额即为当前剩下的所有金额
packet = round(money,2)
elif(money > 0.01):
if(money - money/(people-j)*2 < 0.01*(people-j-1)):
packet = round(uniform(0.01,money/(people-j)*2 - 0.01*(people-j-1)),2)
#不能提前抢光红包
else:
packet = round(uniform(0.01,money/(people-j)*2),2)
else:
packet = 0.01
luck[j].append(packet)
money = money - packet
#print(luck)
for i in range(people):
print('***********************')
print('第{}个人'.format(i+1))
print('max:%.2f'%max(luck[i]),'min:%.2f'%min(luck[i]))
#print('min:%.2f'%min(luck[i]))
print('average:%.2f'%np.mean(luck[i]))
most_luck = [0]*people
matrix = np.array(luck).T
for i in range(times):
a = list(matrix[i])
position = a.index(max(a))
most_luck[position] = most_luck[position] + 1
for i in range(people):
most_luck[i] = round(most_luck[i]/times,2)
print(most_luck)
总结如下:
1.先抢不可能有大红包,后抢可能有大额红包
2.人少时,手机最佳的可能性均等;人多时,后抢手气最佳的可能性更大
(但这并不意味着后抢更好,毕竟后抢有可能抢不到!!!)