python抢红包random实现_python写红包的原理流程包含
random,lamb。。。
Python写红包的原理流程
⾸先来说说要⽤到的知识点,第⼀个要说的是扩展包random,random模块⼀般⽤来⽣成⼀个随机数
今天要⽤到ramdom中unifrom的⽅法⽤于⽣成⼀个指定范围的随机浮点数通过下⾯的图简单看下:
这⾥就打印了⼀个值范围是在10~20之间的浮点数。
在来说说lambda表达式是匿名函数,是函数的另⼀种表达⽅式,以下清晰了介绍了使⽤效果:
t函数有3个值,返回3个数之和,f是lambda表达式,作⽤同样是返回三个数只和,def 类似 lambda,t类似f, (x,y,z):类似x,y,z:, return x+y+z类似:x+y+z  最后都调⽤函数返回其和不过在此提醒函数可以写很复杂,lambda写复杂了就不容易理解,代码毕竟简单易懂为先。
进⼊红包思路主题
random在python中的意思好了前⾯简单的介绍玩今天要使⽤的⼯具该进⼊正题说说红包的思路了,在你发红包的时候要填写两个
重要参数就是红包的⾦额我命名为cash,⼈数person,在就要思考重要的⼀点就是红包的最⼤值和最⼩值,不会有点红包领到0吧,⼀般0.01为最⼩值,为什么会来说还有最⼤值,你想假如⼀个10块的红包6个⼈抢第⼀个能抢了9.99,那么第⼆个⼈只有剩下0.01,后⾯的⼈没得强,这不就有问题了。所以最⼤值应该就是红包总⾦额减去最⼩值乘以⼈数(10-0.01x6)这样才保证⼤家都有得抢当然最贪婪的写法是10-0.01x5有⼈会问为什么是5,已经把第⼀个⼈排除剩下五个最惨的结局都是0.01。基本你掌握这个思路就好写代码了看看如下:
#!/usr/bin/env python#-*-coding:utf-8 -*-
importrandomdic={}
lis= ['KeLan','Monkey','Dexter','Superman','Iron Man','Robin']defredpacket(cash,person,index):if cash>0 and person !=1:
n= round(random.uniform(0.01,cash-(0.01*person)),2)
dic[lis[index]]=nprint str(n).ljust(4,"0")
person-=1cash-=n
index+=1redpacket(cash,person,index)else:
dic[lis[index]]=round(cash,2)print str(cash).ljust(4,"0")
redpacket(10,len(lis),0)printdicprint "⼿⽓最佳:",max(dic.items(),key=lambda x:x[1])
我在这⾥⽤的是递减的⽅式来递归剩余的钱数与⼈数,加了个判断防⽌⽆限递归。只要钱cash⼤于0并且person剩余⼈数不是1那么继续往下⾛:n是随机浮点数,范围是从最⼩的0.01到当前的⾦额,round是取⼩数点后保留2位,这字典⽤来存放相应的⼈抢了多少红包⾦额,然后⼈数⾃减少1,⾦额⾃减当前抢⾛的⾦额index是从⼈名中顺序取值(当然实际不会按顺序抢,这⾥只是掩饰介绍过程),然后递归调⽤⾃⼰把剩余的钱cash,剩余⼈数person,新位置的⼈重新传参,如果剩下最后⼀个⼈(测试了50次,没有发现⾦额⼩于0的情况所以这⾥只表述⼈)那么剩下的钱就都是他的并且添加到字典,打印输出,由于else内没调⽤⾃⾝递归⾃然结束最后打印字典的包含了⼈与抢红包⾦额对应,最后要答应⼿⽓最佳的⼈⽤max从列表中取最⼤值dic.items()返回以元组形式⼀⼀对应的列表[(person⼈,cash钱)],lambda写的是取每个元素的的1位置来做⽐较也是就是cash值来做⽐较,max拿出列表中最⼤的元组。
来看看最后打印效果如下
是不是简单清晰,最后⼤家可以多试试效果,我在此只是把⾃⼰的思路与⼤家分享了⼀下,当然⼤家有好的建议修改或者更优化的⽅式在后⾯留⾔,互相学习。感谢⼤家的观看。