
我不知道有多少人被这张照片欺骗: )
原因是这样的. 上周,一些同学问小编,并看了小编的示例代码以敲打该代码. 我觉得我会写. 如果我不阅读,可能是我写的. 但是一旦我独立编写了程序,便感到无法上手.
实际上,这是很正常的. 当我第一次开始学习编写代码时,我遵循了其他人的例程来写下来. 几乎没有例程可供阅读. 很难形成我自己的例程. 这和做数学问题一样. 如果您想了解所有问题,则这种可能性很小,并且可以通过大量练习找到自己的套路.
这是新年. 所有公司都会参加一些彩票活动. 小编今天将讨论这个问题. 如果我想编写一个简单的彩票程序,编辑器将如何编写它?
注意: 无论您是从事Python还是业余爱好,请记住: 项目开发经验始终是核心. 如果您没有2020年最新的Python入门级高级实战视频教程,则可以转到编辑器的Python交流中心. 裙子: 齐一你可以在依九,七,七,五和五(数字同音)的转换下找到它,有许多新的python教程项目,还可以向旧驱动程序寻求建议!
让我们先整理一下想法,目标是什么?
目标是编写彩票程序,那么彩票程序的核心是什么?
当然,如何判断一个人赢了. 那么如何判断一个人获胜呢?
是否可以使用随机函数进行操作?
首先,我们首先使用随机函数来确定是否获胜. 代码可以编写如下吗?
import random
# 判断中奖函数
def lottery():
flag = random.randint(0, 9)
if flag < 2:
return True
else:
return False复制代码
首先,如果获胜率为20%,我们将得到一个介于0到9之间的随机正整数(我不讨论随机是否真的是随机的,从狭义上讲,我们可以将其视为随机). ,我们可以认为少于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复制代码
以上测试已经循环了100万次,执行大约需要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复制代码
因此,在这里,我们可以修改中的数据以实时操作获胜率. 当然,可以使用连接池之类的技术来优化上述缓慢的问题.
就这样结束了吗?不,不,然后我们增加需求.
现在,我们只能知道每次都没有胜利,只有一个奖项,但是现在我们要成为三个奖项,例如: 一等奖,二等奖抽奖比例设置,三等奖,我们应该怎么做?
对以前的彩票抽奖方法的此更改有点大. 首先抽奖比例设置,我们首先向添加其他两个奖励配置:
最好使三个奖项的分母保持一致,否则后续的计算会增加复杂性.

修改我们获取配置的方式:
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()复制代码
最终测试结果如下:
编辑的角色还可以,您可以直接获得三等奖.
那么,在这里,一个简单的彩票程序完成了吗?实际上,可以在以后添加. 如果每个奖项都有限制,并且可以随时调整限制等,我将不在此处列出.
整体代码稍长,我不会发布. 将其上传到代码仓库. 有兴趣的学生应该亲自访问它.
最后一点: 无论您是从事Python还是业余爱好,请记住: 项目开发经验始终是核心. 如果您没有2020年最新的Python入门级高级实用视频教程,则可以转到编辑器的Python交流中心. 裙子: 七个您可以在以yiyi 9.7巴和五个(数字同音)的转换下找到它,有许多新的python教程项目,还可以向旧驱动程序寻求建议!
本文中的文字和图片来自互联网以及您自己的想法. 它们仅用于学习和交流目的,没有任何商业用途. 版权属于原始作者. 如有任何疑问,请及时与我们联系以进行处理.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-199300-1.html
加油哈
用录音机
别忘了中国的军舰也去过人家海域