使用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.惊!刮刮乐的冷知识和小技巧,快来一探究竟公司回应 迎接共建一带一路更高质量的新发展 0 Play 00:00 % buffered00:00 00:00Enter fullscreen惊!刮刮乐的冷知识和小技巧,快来一探究竟王晓爱体彩 吉林 0 打开网易新闻 体验效果更佳90年代河南最狠女死刑犯,身穿红衣面带微笑,到死都不服气 小地大智 3113跟贴 打开APP 同属阿拉伯国家,以色列为何不打https://m.163.com/v/video/VLHHVVMKL.html
2.刮刮乐90%中奖率的秘诀2中奖停手:刮一张如果中了,立马停手!!不要贪!! 3及时止损:当连续三天(三次)没中,请立马停止半个月以上,因为手气都是一段时间的,适可而止! 本人从刮刮乐以来总收入大概在5000+,虽然没有中过大奖,但是已经很满意了!!我中奖率最高的彩票站是在蜀都万达后面那条美食街拐弯处(安德鲁森旁边https://m.dianping.com/ugcdetail/239299492?bizType=29
3.刮刮卡和彩票,你觉得哪个中奖概率更高刮刮乐和彩票属于两种不同的福利彩票,在中奖概率上也存在一定的区别。一般来说,彩票的中奖概率较高,但中奖金额相对较小。 与之相比,刮刮乐的中奖概率较低,更依赖于运气的因素。对于刮刮乐来说,无论是哪一张刮卡,中奖的可能性都相差不大,正常整本刮刮乐的中奖几率大约在30%到45%左右,少数幸运儿能够赚https://weibo.com/ttarticle/p/show?id=2309404975906631582133
4.哪种刮刮卡中奖率高?爱问知识人体彩的中奖率要高于福彩的刮刮彩,你可以选择哪种一等奖奖金不是很高的哪种,中小奖的机会大一点。https://iask.sina.com.cn/b/4FWvAnTgF0.html
5.100万刮刮奖图片彩票店里边,销售的刮刮乐是不是真的有大奖?大家就我而言,从零开始的最大奖品是1000元。我见过中国最大的奖品是10万元,亲眼目睹了这张刮卡。 你中过刮刮奖吗? 作为一名经验丰富的彩票中奖者,我可以负责任地告诉你,刮刮奖的中奖率一般,而刮刮奖中奖的机会非常小。 刮刮奖以1000元面值彩票为例,中奖面值一般不超过700~800,且不低于400~500,基本在这个范围内,http://www.zzfmdn.com/article/957651
6.面值为5元的福利彩票刮刮卡.设计方案如下:①该福利彩票中奖率福彩中心发行彩票的目的是为了获取资金资助福利事业.现在福彩中心准备发行一种面值为5元的福利彩票刮刮卡.设计方案如下:①该福利彩票中奖率为50%,②每张中奖彩票的中奖奖金有5元.50元和150元三种,③顾客购买一张彩票获得150元奖金的概率为p.获得50元奖金的概率为2%.(1)假设http://www.1010jiajiao.com/gzsx/shiti_id_5d9bcdc54611314ee85ff0fb03a2a6f0
7.城事冬至福利到,5000个现金红包速抢!中奖率超高南方plus单个最高200元 ,中奖率超高 一不小心 你就是今天的锦鲤! 抢红包 参与方式 1、进入“禅城发布”微信公众号; 2、打开微信对话框,输入口令“福利”,点击弹出刮刮卡页面,即可参与抽奖。 游戏细则 活动时间:12月21日至12月24日 活动奖品:现金红包 活动规则:每个微信ID每天可抽奖5次 https://static.nfapp.southcn.com/content/201812/22/c1783998.html?group_id=1
8.网红云商城快手在分析用户反馈时,我发现了几个关键点:大多数中奖的用户表示,虽然中奖金额不大,但确实增加了购物的乐趣;有用户提到,刮刮卡的中奖率似乎并不高,但这种不确定性恰恰是活动吸引人的地方;也有用户担心个人信息的安全性,这提示我们在参与此类活动时,应选择信誉良好的平台。 http://www.duoruimusic.com/dy/7734.html
9.面值为5元的福利彩票刮刮卡,设计方案如下:①该福利彩票中奖率福彩中心发行彩票的目的是为了获取资金资助福利事业,现在福彩中心准备发行一种面值为5元的福利彩票刮刮卡,设计方案如下:①该福利彩票中奖率为50%;②每张中奖彩票的中奖奖金有5元,50元和150元三种;③顾客购买一张彩票获得150元奖金的概率为p,获得50元奖金的概率为2%.(1)假设某顾客一次性花15元购买三张彩票,求其至https://www.zybang.com/question/393ce4b595bb1366e5827af1c46fbdda.html
10.入口app官方官网登录2024-11-30 20:09官网安卓app地址网址 。 中建八局厦门一在建工地项目用照片虚假打卡?当地有关部门回应 暴雪娱乐日前宣布,经典之作《魔兽争霸3:重制版》的上市时间将有所推迟。原定的发布时间被延至2020年1月29日,同步在中国大陆地区推出新内容测试。在此之前,游戏已经进入http://m.hejunxian.club/084277.html
11.php抽奖概率算法(刮刮卡,大转盘)抽奖概率设计资源本文实例为大家分享了php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法,用法很简单,代码里有详细注释说明,供大家 参考,具体内容如下 <?php /* * 经典的概率算法, * $proArr是一个预先设置的数组, * 假设数组为:array(100,200,300,400), * 开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范https://download.csdn.net/download/weixin_38629391/13720412
12.刮刮卡可以设置中奖概率吗?帮助中心刮刮卡可以设置中奖概率吗? 2024-04-03 11:27:12 刮刮卡中奖率设置路径:商城电脑端后台 - 应用 - 营销玩法 - 刮刮卡 - 编辑刮刮卡活动,在活动设置的<奖项设置>中,添加奖品或者编辑奖品就可以设置中奖率哦。 拓展阅读 ·加价购活动的换购商品可以选择套餐商品吗?https://help.youzan.com/displaylist/detail_5_5-1-29822
13.“双十一”NIULAB上新!童装7折,周边刮刮卡100%中奖率等你来正面 背面 原价:158元 优惠价:128元 童装7折优惠 NIU LAB卖得很好的童装上裔·玄芮,店长为大家争取到福利啦! 自11月11日当天起-11月30日 童装全部 7折! 到店可享受优惠 号外号外! 在NIU LAB线下购买任两件服装 可获得一张 百分百中奖率的 刮刮卡! 奖品如下 ↓ 快来囤货吧!?https://www.ja-jddc.com/newsinfo/7740121.html
14.神秘快递100%中奖刮刮卡背后隐藏的秘密是什么?快递刮刮卡中奖率100% 要兑换奖品,您需要扫描二维码 近日,记者收到一份神秘快递,里面装着一份小礼物、一封感谢信、一张刮刮卡。感谢信称,这是为答谢顾客而赠送的感谢礼,并邀请顾客参加“邀您刮豪华大礼”活动,最高现金奖励1万元。 记者带着这件快递来到北京市公安局刑侦大队,找到此前采访过的反诈骗民警,一探这https://m.bjhwtx.com/h-nd-159184.html
15.“刮刮乐”中奖率100%?警惕!“刮刮乐”中奖率100% ?警惕! “您的快递到了,请签收。” “里面还赠送了一张刮刮卡。(刮开后)我中奖啦!” 近日 李女士收到了一个 免费赠送的包裹 虽然里面只有一瓶洗手液 但是包裹里附带了一张“刮刮卡” 写着“100%中奖” 李女士没有细想就刮开了http://share.suqian360.com/wap/thread/view-thread/tid/477520
16.官网官方地址app入口5、(代码编号161)九天龙魂绝明搏贯特效同万胜丈八矛一模一样。6、(代码编号814)机铁火神弓极品的弓,特效是射出3个火箭,一碰到敌人,马上就变成一大滩的火海,发动机率极高,威力惊人。7、(代码编号833)奥汀多赖把可经常性的给予对手重伤,并发动多重炎墙伤敌。8、(代码编号830)炼狱魔刀特效是发出蓝色的风柱,杀兵http://m.wdghnszlb.club/625163.html