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

af0fcc30b540573985aa904098ba21b6.png

前言

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

作者: 极客挖掘机

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 数据库用作数据存储),先看下数据库的数据:

1e4ebfef1b26891243a90d0a2717def4.png

很简单的设计了一张表,里面有意义的字段有两个,一个用作中奖率的分子部分,一个用作中奖率的分母部分。分母部分最好要设置成 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 个奖项,如:一等奖、二等奖、三等奖那该怎么办?

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

1997855afeae02cf027008433d37b33a.png

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

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

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()

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

cc4dd773274d0dc4eb8a5791c629a68b.png

增加会员判断

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

最终测试结果如下:

357da79df584cf88a8476f5863a368a6.png

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

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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Dev C++安装第三方库boost

Dev_C安装第三方库boost 安装步骤 准备工作下载boost库&#xff0c;下载地址https://sourceforge.net/projects/boost/1. 设置GCC的环境变量PATH 设置环境变量path,在其中加上DEV-C编译器的路径&#xff08;gcc.exe所在路径&#xff09;&#xff0c;如C:\Program Files (x86)…

bash的一些小技巧

1、从输入读入变量 eg:read -ep "input yes or no: " flag 用e选项表示编辑&#xff0c;可以使用backspace删除 2、数组 a、索引数组 declare -a arr(var1 var2 var3) 用空格分割&#xff0c;如果直接访问变量$arr&#xff0c; 则获取的是数组的第一个元素&#xff0…

golang switch_为什么程序员都不喜欢使用 switch ,而是大量的 if……else if ?

点击上方“我要学编程”&#xff0c;选择“置顶/星标公众号”福利干货&#xff0c;第一时间送达&#xff01;来自 | C语言Plus请用5秒钟的时间查看下面的代码是否存在bug。OK&#xff0c;熟练的程序猿应该已经发现Bug所在了&#xff0c;在第13行下面我没有添加关键字break; 这就…

RabbitMQ 安装与简单使用

在企业应用系统领域&#xff0c;会面对不同系统之间的通信、集成与整合&#xff0c;尤其当面临异构系统时&#xff0c;这种分布式的调用与通信变得越发重要。其次&#xff0c;系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地方&#xff0c;比如发送短信&#…

windows svn

windows svn 1.1Svn和VisualSvn介绍 VisualSvn Server2.5.6&#xff08;版本控制服务器&#xff09;免费开源软件 是基于Windows平台上的Subversion服务器&#xff0c;它是免费的 官方下载&#xff1a; http://www.visualsvn.com/files/VisualSVN-Server-2.5.6.msi TortoiseSvn…

docker-compose下载慢_编写Docker Compose时要注意的五大常见错误

在构建容器化的应用时&#xff0c;开发人员往往需要某种方法来引导启动目标容器&#xff0c;以对其进行代码级别的测试。尽管业界有许多方法可以实现该目的&#xff0c;但Docker Compose是目前最受欢迎的一种方法。它能够让如下两个方面变得容易实现&#xff1a;指定在开发过程…

frame越过另一个frame_拥抱swoole(三)之用php实现一个混合服务器

混合服务器&#xff0c;就是可以同时支持http&#xff0c;websocket&#xff0c;tcp等的服务器&#xff0c;用swoole就是这么简单&#xff0c;分分钟&#xff0c;就可以愉快地搞物联网开发了&#xff0c;啥都支持&#xff0c;我采用官方的例子&#xff0c;创建一个混合服务器&a…

Hibernate学习系列————注解一对多单向实例

2019独角兽企业重金招聘Python工程师标准>>> 开发环境&#xff1a;MysqlEclipse 一对多单向的列子原理&#xff1a;一个班级&#xff0c;多个学生&#xff0c;学生端为多的一端&#xff0c;他们拥有一个外键指向相同的班级。 项目结构 需要的jar包 hibernate.cfg.xm…

sudo apt-get nmap 报错锁占用

在Ubuntu中用apt-get命令安装软件是出现如下错误&#xff1a; 网上搜了一下原因&#xff0c;说是有另外一个程序在运行&#xff0c;导致锁不可用&#xff0c;原因可能是赏析运行更新或安装没有正常完成。这是因为上次更新或者安装没有正常完成。 网上的两种解决方法&#xff1…

python逐行读取txt写入excel_用python从符合一定格式的txt文档中逐行读取数据并按一定规则写入excel(openpyxl支持Excel 2007 .xlsx格式)...

前几天接到一个任务&#xff0c;从gerrit上通过ssh命令获取一些commit相关的数据到文本文档中&#xff0c;随后将这些数据存入Excel中。数据格式如下图所示观察上图可知&#xff0c;存在文本文档中的数据符合一定的格式&#xff0c;通过python读取、正则表达式处理并写入Excel文…

Extjs 之 initComponent 和 constructor的区别(转)

在创建自定义类时&#xff0c;先构造&#xff08;constructor)后初始化&#xff08;initComponent&#xff09;。如&#xff1a;&#xff08;在旧的Extjs 版本中使用 Ext.extend 实现扩展&#xff09; Ext.define(Btn,{ extend:Ext.button.Button, init…

hive遍历_从Hive中的stored as file_foramt看hive调优

一、行式数据库和列式数据库的对比1、存储比较行式数据库存储在hdfs上式按行进行存储的&#xff0c;一个block存储一或多行数据。而列式数据库在hdfs上则是按照列进行存储&#xff0c;一个block可能有一列或多列数据。2、压缩比较对于行式数据库&#xff0c;必然按行压缩&#…

帮助孩子学会感恩_页数204_出版日期2015.03_完整版PDF电子书下载

帮助孩子学会感恩_页数204_出版日期2015.03_完整版PDF电子书下载 带索引书签目录高清版_13813212 下载链接http://pan.baidu.com/s/1geEmUeZ 【作 者】&#xff08;英&#xff09;蒂姆惠特尼&#xff08;TimWhitney&#xff09;著【丛书名】陪孩子成长系列丛书【形态项】 204 …

xwpftablecell设置字体样式_HTML的文字样式

font 属性可以用来作为 font-style, font-variant, font-weight, font-size, line-height 和 font-family 属性的简写&#xff0c;或将元素的字体设置为系统字体。字体修改font-family 属性&#xff1a;设置HTML页面中的字体font-size 属性&#xff1a;设置字体大小font-weight…

15-CSS基础-浮动流

浮动 网页的布局方式 什么是网页的布局方式? 网页的布局方式其实就是指浏览器是如何对网页中的元素进行排版的 标准流(文档流/普通流)排版方式 其实浏览器默认的排版方式就是标准流的排版方式在CSS中将元素分为三类, 分别是块级元素/行内元素/行内块级元素在标准流中有两种排版…

git-- 使用

git 使用时两个人冲突: Resolve conflicts

高内聚低耦合通俗理解_抱歉,请不要把“业务逻辑层”理解为“业务中台”

在IAS2019中台架构峰会上&#xff0c;我曾与一位年轻帅气的技术小伙来了一番有趣的对话。因为和朋友有约&#xff0c;所以我在现场互动结束之后&#xff0c;就急匆匆地跟其他嘉宾打了声招呼&#xff0c;抱着笔记本冲出了会场。但没想到刚到电梯口&#xff0c;却被一位帅小伙迎面…

org-mode入门教程

org-mode 入门教程By Z.H. Fu切问录 www.fuzihao.orgorg-mode 入门教程 org-mode是Emacs提供的一个强大的编辑模式&#xff0c;可以用于做会议笔记以及制作各种待办事项&#xff08;GDT&#xff09;。其语法类似于Markdown但是提供了比Markdown更多的操作&#xff0c;再加上Ema…

如何对web.config进行加密和解密

http://blog.csdn.net/jf_jifei/article/details/6527390 在WEB网站开发过程中&#xff0c;如果我们将数据库连接字符串封装到.DLL文件中&#xff0c;将会给数据库和程序的迁移带来麻烦&#xff0c;因为万一服务器地址或者数据库发生变更&#xff0c;那么我们就不得不修改源程序…

java 爬虫_Java原生代码实现爬虫(爬取小说)

Java也能做爬虫。现在提到爬虫人第一个想到的就是python&#xff0c;其实使用Java编写爬虫也是很好的选择&#xff0c;Java成熟的爬虫框架很多&#xff0c;下面给大家展示一个使用Java基础语言编写的爬取小说的案例&#xff1a;实现功能&#xff1a;爬取目标网站全本小说代码编…