使用Python写一个简易的抽奖程序python

不知道有多少人是被这个头图骗进来的:)

事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下手。

其实这个很正常,刚开始学习写代码,都是跟着别人的套路往下写,看的套路少,很难形成自己的套路,这就和做数学题是一样的,做一道题就想会所有的题目,这个可能性微乎其微,都是通过大量的练习来摸索到自己的套路。

正好快过年了,各个公司都会搞一些抽奖活动,小编今天就来聊一下,如果要写一个简单的抽奖程序,小编是怎么写的。

分析需求

我们先整理下思路,目标是什么?

目标是要写一个抽奖程序,那么抽奖程序的核心是什么?

当然是如何判断一个人中奖了。那么如何判断一个人中奖呢?

是不是可以通过随机函数来操作呢?

中奖方法

一步一步来,我们先通过随机函数来判断是否中奖。代码是不是可以先写成下面这样:

importrandom#判断中奖函数deflottery():flag=random.randint(0,9)ifflag<2:returnTrueelse:returnFalse

首先,我们获取0~9之间的随机正整数(这里不讨论random是不是真随机,从狭义上来讲我们可以认为它是随机的),如果中奖率为20%的话,我们可以认为小于2的数字为中奖,其余的为没有中奖。然后中奖后返回True,没有中奖返回False。

我们加一个入口测试函数,测试一下上面的代码是否能正常运行,并且中奖率是否能维持在大约20%左右。

if__name__=='__main__':#中奖次数a=0#没有中奖次数b=0foriinrange(1000000):if(lottery()):a+=1else:b+=1print('共计中奖:',a,',未中奖:',b)

执行结果:

共计中奖:200145,未中奖:799855

上面的测试总共循环了1百万次,大约执行需要2~3秒左右,速度还是蛮快的。可以看到,中奖结果确实接近20%左右。

动态中奖率

难道到这里就结束了么?当然不可能,这里只是刚刚开了个头。

这时候咋整,傻眼了吧。

既然中奖率要可调整,那么我们中奖率就不能定死在程序中了,这个中奖率需要有一个地方去做存储,在每次做随机的时候将这个中奖率取出来。

简单易行的方法就是将这个中奖率放在数据库中或者缓存服务中,这个根据实际业务场景来定。一般是根据预估访问压力的大小来进行技术选型,如果压力不是特别大,那么放在数据库中也是可以的,如果并发会比较高的话,建议还是放在缓存中。

我们来写一个从数据库获取中奖概率的方法(为了展示直观,小编这里直接使用Mysql数据库用作数据存储),先看下数据库的数据:

很简单的设计了一张表,里面有意义的字段有两个,一个用作中奖率的分子部分,一个用作中奖率的分母部分。分母部分最好要设置成100、1000、10000这种,这样计算中奖率会比较好计算。

defget_lottery_rate():conn=pymysql.connect(host='localhost',user='root',password='password',database='test',charset='utf8mb4')try:sql='SELECTfenzi,fenmuFROMrate'cursor=conn.cursor()cursor.execute(sql)result=cursor.fetchone()returnresultexceptExceptionasex:print(ex)finally:conn.close()

运行这个方法测试结果如下:

(10,100)

可以看到,我们获得了一个元组,里面的内容就是我们从数据库取出来的分子和分母。

我们将前面的抽奖的那个方法改一下,改成从数据库获取中奖比例。修改后的代码如下:

deflottery():rate=get_lottery_rate()flag=random.randint(1,rate[1])ifflag

小编这里将循环次数修改为1000次后,执行结果如下:

共计中奖:92,未中奖:908

那么到这里,我们就可以通过修改数据库中数据实时的操作中奖率了。当然上面的慢的问题我们可以使用数据库连接池等技术进行优化。

增加奖项

那么是否就结束了呢?nonono,我们接着加需求。

现在,我们只能知道每次到底中不中奖,只有一个奖项,但是现在想变成3个奖项,如:一等奖、二等奖、三等奖那该怎么办?

这个对之前的抽奖方法改动就有点大了,首先我们先在数据库增加出来另外两个奖项的配置:

配置这里三个奖项的分母最好保持一致,否则后续计算会徒增复杂度。

修改我们获取配置的那个方法:

defget_lottery_rate():conn=pymysql.connect(host='localhost',port=3306,user='root',password='password',database='test',charset='utf8mb4')try:sql='SELECT*FROMrateorderbyidasc'cursor=conn.cursor()cursor.execute(sql)result=cursor.fetchall()returnresultexceptExceptionasex:print(ex)finally:conn.close()

测试调用后结果如下:

((1,10,100),(2,5,100),(3,1,100))

先在我们要做的是要将这个配置融入进我们之前的中奖的那个方法中,不多说,直接上代码:

#判断中奖函数deflottery():config=get_lottery_rate()flag=random.randint(1,config[0][2])ifflag<=config[0][1]:return1elifflag>config[0][1]andflag<=(config[1][1]+config[0][1]):return2elifflag>(config[1][1]+config[0][1])andflag<=(config[2][1]+config[1][1]):return3else:return0

接着修改我们的做测试的代码:

defmain():#一等奖中奖次数a=0#二等奖中奖次数b=0#三等奖中奖次数c=0#未中奖次数d=0#循环次数e=0foriinrange(1000):e+=1print('当前循环次数:',e)result=lottery()print('当前中奖结果:',result)if(result==1):a+=1elif(result==2):b+=1elif(result==3):c+=1else:d+=1print('一等奖中奖:',a,',二等奖中奖次数:',b,',三等奖中奖次数:',c,',未中奖次数:',d)

调用我们的测试方法:

if__name__=='__main__':main()

小编这里的运行结果如下:

增加会员判断

到这里我们还没完,还能加需求,现在网站大多数都是会员制的,比如白银会员,黄金会员,钻石会员,如果不同的会员等级需要有不同的中奖率,这个是很正常的一件事儿,小编现在还清晰的记得当年某家大型互联网公司代码中的注释“穷逼VIP(活动送的那种)”。

我们假设钻石会员的中奖率为整体中奖率的100%,黄金会员的中奖率为整体中奖率的50%,白银会员的中奖率为整体中奖率的20%。

最简单的实现方式是直接在最外层套一层会员中奖率的判断,不知道各位同学怎么想。

小编这里给出自己的解决方案:

#判断会员等级中奖率过滤#会员等级1.白银会员2.黄金会员3.钻石会员defvip_lottery(level):rate=random.randint(1,10)#如果是钻石会员,直接进入抽奖函数iflevel==3:returnlottery()#如果是黄金会员,50%概率进入抽奖函数eliflevel==2:ifrate<=5:returnlottery()else:return0#如果是白银会员,20%概率进入抽奖函数eliflevel==1:ifrate<=2:returnlottery()else:return0#如果是其他,直接返回未中奖else:return0

我们新增一个测试增加会员过滤的测试方法:

#会员制中奖测试方法deftest_vip():print('请输入您当前的会员等级:1.白银会员2.黄金会员3.钻石会员')level=input()result=vip_lottery(int(level))if(result==1):print('恭喜您中了一等奖')elif(result==2):print('恭喜您中了二等奖')elif(result==3):print('恭喜您中了三等奖')else:print('未中奖,谢谢惠顾')

在我们的入口函数中调用这个方法:

if__name__=='__main__':test_vip()

最终测试结果如下:

小编的人品还可以嘛,直接就能中三等奖。

那么,到这里,是不是一个简易的抽奖程序就算完成了呢?其实还能接着加,如果每个奖项都有数量限制,并且限制的数量是可以随时调整的等等等等,小编这里就不一一列举了。

整体代码写的稍微有些长了,小编就不贴出来了,上传到代码仓库各位感兴趣的同学自己访问吧。

示例代码

总结

以上所述是小编给大家介绍的使用Python写一个简易的抽奖程序,希望对大家有所帮助!

THE END
1.100万刮刮奖图片彩票店里边,销售的刮刮乐是不是真的有大奖?大家你中过刮刮奖吗? 作为一名经验丰富的彩票中奖者,我可以负责任地告诉你,刮刮奖的中奖率一般,而刮刮奖中奖的机会非常小。 刮刮奖以1000元面值彩票为例,中奖面值一般不超过700~800,且不低于400~500,基本在这个范围内,所以当你买刮刮卡到100以上时,前后几张刮刮卡的中奖概率都很低,买之前你应该称一下。 http://www.zzfmdn.com/article/957651
2.刮刮奖有什么技巧吗刮刮奖是一种全凭运气的彩票游戏,没有明确的技巧能够保证中奖。然而,以下是一些玩刮刮奖时可以考虑的一些建议: 1.选择高中奖率的刮刮奖票:不同的刮刮奖票有不同的中奖概率。在购买时,可以参考奖金池的大小和剩余中奖机会,选择较高中奖概率的刮刮奖票。但是请注意,这并不能确保一定中奖。 https://www.360doc.cn/article/75092861_1116925970.html
3.哪种刮刮卡中奖率高?爱问知识人体彩的中奖率要高于福彩的刮刮彩,你可以选择哪种一等奖奖金不是很高的哪种,中小奖的机会大一点。https://iask.sina.com.cn/b/4FWvAnTgF0.html
4.扫码红包55度老绿瓶西凤酒“真金实银”开盖扫红包,最高88.8元点点西凤香,滴滴有惊喜,酒浓情更浓。老绿瓶西凤酒再次以美酒为媒,为广大消费者送祝福,开展扫码红包活动;凡在活动期内购买参奖55°老绿瓶西凤酒产品,开盖扫码即可获得现金红包奖励,瓶瓶有奖,开瓶扫码100%中奖,最高奖金可达88.8元。https://www.gzyxm888.com/h-nd-560.html
5.刮刮奖怎么样中奖几率大(2024已更新微信/小程序)同时,我们提供专项清理,包括微信清理、QQ刮刮奖怎么样中奖几率大清理、深度清理和短视频专清,针对性清理各种垃圾文件,释放手机存储空间。此外,极刻清理软件还有卡慢优化、手机瘦身、实时保护、手机降温、应用卸载等实用功能,从多个刮刮奖怎么样中奖几率大方面优化手机性能,提升使用体验。我们还提供电池修复、网络测速、http://www.tgbus.com/caipiaonewsc0wag9/X10W727.html
6.刮刮奖怎样看出中奖下载刮刮奖怎样看出中奖安卓/pc/苹果版本下载例刮刮奖怎样看出中奖如,网络上流传着许多分析开奖结果和推测赔率变化的文章和视频,可以为玩家们提供一些参考和启发。此外,与其他玩家交流、分享经验也是一个学习的途径。 澳门六合机密资料的神秘性和吸引力,使得许多人对其产生了浓厚的兴趣。尽管我们目前掌握的信息有限,但我们仍然可以以积极的态度去探索其中隐藏的宝藏http://www.northnews.cn/sjappoomq/
7.www.scmc因此,在当前高阶智驾竞争格局尚未定型的情况下,车企不得不选择暂时牺牲利润,以获得更大的高阶智驾用户群体。 "销量是汽车企业的命,没有销量,那些要IPO的车企怎么能上市?为了拉升销量,车企已经顾不得利润率了。"朱西产说。 城市NOA将成标配? 今年年初,特斯拉FSDV12.4版本推出,一时间,国内的高阶智驾技术快速向纯http://www.scmc-xa.com/xxxr333871
8.为2元的福利彩票刮刮卡,设计方案如下:①该福利彩票中奖概率为某福彩中心准备发行一种面值为2元的福利彩票刮刮卡,设计方案如下:①该福利彩票中奖概率为0.2;②每张中奖彩票的中奖奖金有5元,10元和100元三种;③顾客购买一张彩票,获得10元奖金https://www.zybang.com/question/41a2cff454f53d33924953136f4ed0c0.html
9.股票论坛中国福利彩票刮刮奖兑奖日期的话题与回复及中国福利中国福利彩票刮刮奖兑奖日期查询 中国福利彩票刮刮奖兑奖日期怎么看 中国福利彩票刮刮乐兑奖期限 中国福利彩票刮刮乐活动 中国福利彩票刮刮乐争分夺秒 中国福利彩票刮刮乐中奖号码 中国福利彩票刮刮乐兑奖 中国福利彩票刮刮乐新票 中国福利彩票刮刮乐奖金 【尾盘精品】●金针寻龙 扭转乾坤 ● 右侧交易 安全性高 ● 短线选股利https://www.55188.com/search-%D6%D0%B9%FA%B8%A3%C0%FB%B2%CA%C6%B1%B9%CE%B9%CE%BD%B1%B6%D2%BD%B1%C8%D5%C6%DA.html
10.营销活动方案为确保事情或工作高质量高水平开展,预先制定方案是必不可少的,方案是阐明行动的时间,地点,目的,预期效果,预算及方法等的书面计划。那要怎么制定科学的方案呢?以下是小编为大家收集的营销活动方案,仅供参考,欢迎大家阅读。 营销活动方案1 一、活动背景 春节过后,“五一”节将是我们面对的第二个销售旺季,在此期间,https://www.haonh.com/d/39504
11.前些天购物时,微信支付后出一刮刮奖,好奇心,刮出中免费茅台一箱99%问题解决率 · 1对1深度沟通 前些天购物时,微信支付后出一刮刮奖,好奇心,刮出中免费茅台一 问题相似?推荐使用下方服务 专业律师在线解答 严选律师快速响应 马上提问 您好,若您的问题未解决,可直接提问,平台严选专业律师为您实时在线解答。 5分钟前 甘肃-天水用户使用了在线咨询服务 2分钟前 浙江-https://m.66law.cn/question/20223722.aspx