前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者: 极客挖掘机

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

http://t.cn/A6Zvjdun

分析需求

我们先整理下思路,目标是什么? 目标是要写一个抽奖程序,那么抽奖程序的核心是什么? 当然是如何判断一个人中奖了。那么如何判断一个人中奖呢? 是不是可以通过随机函数来操作呢?

中奖方法

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

import random# 判断中奖函数def lottery(): flag = random.randint(0, 9) if flag < 2: return True else: return False

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

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

if __name__ == '__main__': # 中奖次数 a = 0 # 没有中奖次数 b = 0 for i in range(1000000) : if (lottery()): a += 1 else: b += 1 print('共计中奖:', a, ',未中奖:', b)

执行结果:

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

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

动态中奖率

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

如果这时老板说,你这个概率不能调整啊,需要让中奖率可以动态调整的,活动刚开始的时候中奖率要高,随着时间的推移,中奖率要降下来。

这时候咋整,傻眼了吧。

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

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

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

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

def get_lottery_rate(): conn = pymysql.connect(host='localhost', user='root', password='password', database='test', charset='utf8mb4') try: sql = 'SELECT fenzi, fenmu FROM rate' cursor = conn.cursor() cursor.execute(sql) result = cursor.fetchone() return result except Exception as ex: print(ex) finally: conn.close()

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

(10, 100)

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

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

def lottery(): rate = get_lottery_rate() flag = random.randint(1, rate[1]) if flag < rate[0]: return True else: return False

还是运行上面的测试方法,这里要注意下,因为我们现在是从数据库获取数据,每次方法执行都要加上数据库链接的建立与销毁,建议将循环次数修改为 1000 以内,不然执行的时间就有点太长了。

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

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

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

增加奖项

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

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

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

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

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

def get_lottery_rate(): conn = pymysql.connect(host='localhost', port = 3306, user='root', password='password', database='test', charset='utf8mb4') try: sql = 'SELECT * FROM rate order by id asc ' cursor = conn.cursor() cursor.execute(sql) result = cursor.fetchall() return result except Exception as ex: print(ex) finally: conn.close()

测试调用后结果如下:

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

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

# 判断中奖函数def lottery(): config = get_lottery_rate() flag = random.randint(1, config[0][2]) if flag <= config[0][1]: return 1 elif flag > config[0][1] and flag <= (config[1][1] + config[0][1]): return 2 elif flag > (config[1][1] + config[0][1]) and flag <= (config[2][1] + config[1][1]): return 3 else: return 0

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

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

调用我们的测试方法:

if __name__ == '__main__': main()

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

增加会员判断

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

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

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

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

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

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

# 会员制中奖测试方法def test_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()

最终测试结果如下:

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

import randomimport pymysql# 获取中奖配置def get_lottery_rate(): conn = pymysql.connect(host='114.67.111.196', port = 3306, user='root', password='wsy@123456', database='test', charset='utf8mb4') try: sql = 'SELECT * FROM rate order by id asc ' cursor = conn.cursor() cursor.execute(sql) result = cursor.fetchall() return result except Exception as ex: print(ex) finally: conn.close()# 判断中奖函数def lottery(): config = get_lottery_rate() flag = random.randint(1, config[0][2]) if flag <= config[0][1]: return 1 elif flag > config[0][1] and flag <= (config[1][1] + config[0][1]): return 2 elif flag > (config[1][1] + config[0][1]) and flag <= (config[2][1] + config[1][1]): return 3 else: return 0# 判断会员等级中奖率过滤# 会员等级 1.白银会员 2.黄金会员 3. 钻石会员def vip_lottery(level): rate = random.randint(1, 10) # 如果是钻石会员,直接进入抽奖函数 if level == 3: return lottery() # 如果是黄金会员, 50% 概率进入抽奖函数 elif level == 2: if rate <= 5: return lottery() else: return 0 # 如果是白银会员, 20% 概率进入抽奖函数 elif level == 1: if rate <= 2: return lottery() else: return 0 # 如果是其他,直接返回未中奖 else: return 0# 批量测试方法def test(): # 一等奖中奖次数 a = 0 # 二等奖中奖次数 b = 0 # 三等奖中奖次数 c = 0 # 未中奖次数 d = 0 # 循环次数 e = 0 for i in range(1000): e += 1 print('当前循环次数:', e) result = lottery() print('当前中奖结果:', result) if (result == 1): a += 1 elif (result == 2): b += 1 elif (result == 3): c += 1 else: d += 1 print('一等奖中奖:', a, ',二等奖中奖次数:', b, ',三等奖中奖次数:', c, ',未中奖次数:', d)# 会员制中奖测试方法def test_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()

wx.checkjsapi是写在config里面吗_用Python写一个程序,解密游戏内抽奖的秘密相关推荐

  1. python抽奖游戏_利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    原标题:利用Python写一个抽奖程序,解密游戏内抽奖的秘密 前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客 ...

  2. 用Python写一个程序,解密游戏内抽奖的秘密

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 分析需求 我们先整理下思路,目标是什么? 目标是要写一个抽奖程序,那么抽奖 ...

  3. python抽奖教程_利用Python写一个抽奖程序,解密游戏内抽奖的秘密|python基础教程|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 分析需求 我们先整理下思路,目标是什么?目标是要写一个抽奖程序,那么抽奖程序的核心是什么?当然是如何判断一 ...

  4. python怎么写游戏脚本_用PYTHON做一个简单的游戏脚本(基础,详细)

    引言 这段时间迷上了玩点点点的小游戏,但是某些重复的环节着实无聊,就想着能不能用PYTHON做一个游戏脚本,不过为了熟悉需要做脚本的各个模块,于是打算在4399上找一个比较像的游戏做个脚本练练手,后来 ...

  5. 用python做一个简单的游戏,用python写一个小游戏

    大家好,本文将围绕如何用python做一个简单的小游戏展开说明,python编写的入门简单小游戏是一个很多人都想弄明白的事情,想搞清楚用python做一个简单的游戏需要先了解以下几个事情. 1.Pyt ...

  6. python测试抽奖脚本_使用 Python 写一个简易的抽奖程序

    不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...

  7. 用python写搜索引擎_用python做一个搜索引擎(Pylucene)的实例代码

    1.什么是搜索引擎? 搜索引擎是"对网络信息资源进行搜集整理并提供信息查询服务的系统,包括信息搜集.信息整理和用户查询三部分".如图1是搜索引擎的一般结构,信息搜集模块从网络采集信 ...

  8. python俄罗斯方块算法详解_用 Python 写一个俄罗斯方块游戏 (

    @@ -2,34 +2,34 @@ > * 原文作者:[Dr Pommes](https://medium.com/@pommes) > * 译文出自:[掘金翻译计划](https://g ...

  9. 用python写脚本筛选原创微博_基于python编写的微博应用

    本文实例讲述了基于python编写的微博应用,分享给大家供大家参考.具体如下: 在编写自己的微博应用之前,先要到weibo开放平台申请应用的公钥和私钥. 下载python版的SDK,打开example ...

最新文章

  1. 开源大佬面对面:InsightFace带你打造开箱即用的人脸识别系统
  2. 悲观锁代码java_悲观锁的代码实现如何编写?
  3. Python的迭代器和生成器
  4. skywalking官方文档学习
  5. 360服务器linux版,360浏览器Linux版
  6. Unity体积光实现浅析
  7. Oracle for update skip locked 详解
  8. H5游戏助力区块链成2019年新玩法?
  9. uni-app 创建新页面和页面的配置
  10. CSS中的em运用详解,1em等于多少像素?
  11. 接下来是 Downward API,它的作用是:让 Pod 里的容器能够直接获取到这个 Pod API 对象本身的信息。
  12. maya加载不了arnold的mtoa可能是这个低级错误!
  13. Seagate-保修验证(za25shrx)
  14. nload0.7.2编译及使用说明
  15. (转载)简述马尔可夫链
  16. Microbiome杂志和主编简介
  17. 当企业面临困境时,你该怎么办?——听谢欣老师谈他眼中的酷讯
  18. 解决Windows11/10本地账户改用Microsoft账户登录显示“发生了错误”的问题
  19. Hexo 博客优化之博客美化系列(持续更新)
  20. 去除Typora红色波浪线

热门文章

  1. jquery vilidate 使用小例
  2. [WPF]xml序列化以及反序列化数据
  3. Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)
  4. 出栈顺序 与 卡特兰数(Catalan)的关系
  5. Sql Server字符串函数
  6. hdu4565之矩阵快速幂
  7. jQuery --- grep
  8. 研究人员发现:基于文本的AI模型容易受到改述攻击
  9. Algs4-1.4.38 3-sum的初级算法与ThreeSum性能比较
  10. 《容器技术系列》一1.4 Docker运行案例分析