春节将至,我决定尝试使用python来制作一个抢红包的小程序
这个程序的技术要求并不是很高,只需要掌握random模块的知识即可完成
首先,引入random模块,用户输入总金额(total),以及分配的人数(division)
import random
total=float(input('The total amount of your rad packet:'))
division=int(input('How many people are to get the red packet:'))
之后我进行了第一次尝试(失败)
第一次尝试主要是直接进行随机操作,每一次的总金额发生变化,减去上一个人得到的金额,直至分配结束。
summoney=-total
for i in range(division-1):
money=random.uniform(0.01,total-0.01)
print('the %d player get %.2f yuan'%(i+1,money))
total-=money
summoney+=money
lastone=abs(summoney)
print('the %d player get %.2f yuan'%(division+1,lastone))
运行结果如下:
总结:
使用此方法出现的结果有二:
- 当总数额偏大的时候前几个个抢红包的人收益总是偏大
- 会出现后期-0.01元的情况,即红包提前被分完的情况
因此此程序可用度不高
.
.
.
接下来是第二次尝试(失败)
在第二次尝试的时候我选择了使用函数的方法,这个方法使程序与第一次相比更加稳定,但是第一次出现的问题依然存在
def hongbao(tota,num):
each=[]
already=0
for i in range(1,num):
t=random.uniform(0.01,(tota-already-0.01))
r=float('%.6f'%t)
each.append(r)
already+=t
each.append(float('%.6f'%(tota-already)))
return each
a=hongbao(total,division)
for i in range(division):
print('the %d player get %.2f yuan'%(i+1,a[i]))
但是不会出现-0.01元的情况
运行结果如下:
程序的可用度依然不高
于是我选择进行第三次尝试(较为成功)
这次尝试源于网上提供的思路,即为了保证每个人的收益均值,所以每次红包金额的范围被控制在(0.01,m/n*2)之间,其中m为剩余金额,n为剩余人数,这样即可以保证每次红包金额的均值是相同的。
举个例子:
假设有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元。
以此类推,每一次随机范围的均值是相等的。
此外,前两次尝试时总是会涉及保留两位小数的问题,较为繁琐也缺少精度,因此,在此次尝试中统一将数值*100,用randint的方法取整数后在/100,由此来保证数据的可靠性。
此次尝试中还加入了运气王组件
each=[]
rest=total*100
restpeople=division
for i in range(1,division):
if rest==0:
print('done')
else:
money=random.randint(1,int((rest/restpeople)*2)-1)
restpeople-=1
rest-=money
each.append(money)
print('the %d player get %.2f yuan'%(i, money/100))
each.append(rest)
print('the %d people get %.2f yuan'%(division,rest/100))
print('the best one is %d'%(each.index(max(each))+1))
运行结果如下:
这个方法较优,并且会在人数不满足条件的情况下报错
唯一的小小的不足就是
这个方法会导致除了最后一个人以外的每个人都不会得到超过两倍均值的红包
以上就是今天的尝试