马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 鱼C-小师妹 于 2022-4-30 19:00 编辑
在线讲解:
经过上一节我们应该对产生随机数字的操作烂熟于心~
双色球是中国福利彩票的一种玩法,简单说就是:
- 从 33 个红色球中抽 5 个
- 从 16 个蓝色球中抽 1 个
然后生成一组 6 位数。
有不同的中奖规律:
一等奖(6+1)中奖概率为:红球 33 选 6 乘以蓝球 16 选1=1/17721088=0.0000056%;
二等奖(6+0)中奖概率为:红球 33 选 6乘以蓝球16 选 0=15/17721088=0.0000846%;
以此类推
我们通过编程来写个双色球程序,由用户指定要生成的号码组数。
由上面的描述可知,我们需要随机生成 6 个红色球号码和 1 个蓝色球号码。
经过前面的练习肯定首先想到 random 模块来生成随机数。
此外“每期开出的红色球号码不能重复”,而使用随机函数我们是不能保证每次产生的随机数都不相同,会出现相同的情况。
因此我们在设计程序时需要判断每次新生成的红色球号码是否和已生成的红色球号码相同。
如果有重复,则需要重新生成新的红色球号码,显然又要用到 while 循环。
上面这些就是核心部分,我们可以将它们封装到一个函数中。
这样当用户指定要生成的组数后,我们只需按照组数调用函数即可。
根据上面的分析,我们来编写程序:
import random
if __name__ == "__main__":
print("===请输入要生成的彩票组数===")
round = int(input("组数:"))
这里输入时肯定会有人不按套路出牌,输入字符串之类的。
我们可以通过 Python 中的异常处理机制来实现程序保护。
异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。
一般情况下,在 Python 无法正常处理程序时就会发生一个异常。
当 Python 脚本发生异常时我们需要捕获处理它,否则程序会终止执行。
捕捉异常最常用的是 try/except 语句。
try/except 语句用来检测 try 语句块中的错误,从而让 except 语句捕获异常信息并处理。
再结合 else 语句,就可以实现没有异常时的正常操作:
import random
if __name__ == "__main__":
try:
print("===请输入要生成的彩票组数===")
round = int(input("组数:"))
except:
print("===输入有误,你捣乱,哼!不给你生成了===")
else:
print(f"正在为鱼油随机生成{round}组彩票")
运行程序,当用户正常输入组数后,就执行 else 中的代码:
稍后我们调用生成彩票的函数也是在 else 中。
接下来,我们输入非数字试试:
try 中就会抛出异常,因为 int 中没办法传入支付,会报错:
>>> int(s)
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
int(s)
NameError: name 's' is not defined
这些由编辑器发现的错误都是异常,在 Python 中有这么多定义:
异常名称 | 定义 | BaseException | 所有异常的基类 | SystemExit | 解释器请求退出 | KeyboardInterrupt | 用户中断执行(通常是输入^C) | Exception | 常规错误的基类 | StopIteration | 迭代器没有更多的值 | GeneratorExit | 生成器(generator)发生异常来通知退出 | StandardError | 所有的内建标准异常的基类 | ArithmeticError | 所有数值计算错误的基类 | FloatingPointError | 浮点计算错误 | OverflowError | 数值运算超出最大限制 | ZeroDivisionError | 除(或取模)零 (所有数据类型) | AssertionError | 断言语句失败 | AttributeError | 对象没有这个属性 | EOFError | 没有内建输入,到达EOF 标记 | EnvironmentError | 操作系统错误的基类 | IOError | 输入/输出操作失败 | OSError | 操作系统错误 | WindowsError | 系统调用失败 | ImportError | 导入模块/对象失败 | LookupError | 无效数据查询的基类 | IndexError | 序列中没有此索引(index) | KeyError | 映射中没有这个键 | MemoryErro | 内存溢出错误(对于Python 解释器不是致命的) | NameError | 未声明/初始化对象 (没有属性) | UnboundLocalError | 访问未初始化的本地变量 | ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 | RuntimeError | 一般的运行时错误 | NotImplementedError | 尚未实现的方法 | SyntaxError | Python 语法错误 | IndentationError | 缩进错误 | TabError | Tab 和空格混用 | SystemError | 一般的解释器系统错误 | TypeError | 对类型无效的操作 | ValueError | 传入无效的参数 | UnicodeError | Unicode 相关的错误 | UnicodeDecodeError | Unicode 解码时的错误 | UnicodeEncodeError | Unicode 编码时错误 | UnicodeTranslateError | Unicode 转换时错误 | Warning | 警告的基类 | DeprecationWarning | 关于被弃用的特征的警告 | FutureWarning | 关于构造将来语义会有改变的警告 | OverflowWarning | 旧的关于自动提升为长整型(long)的警告 | PendingDeprecationWarning | 关于特性将会被废弃的警告 | RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 | SyntaxWarning | 可疑的语法的警告 | UserWarning | 用户代码生成的警告 |
有这么多异常都是可以被编译器识别出来哦,更多异常处理的玩法,可以去看小甲鱼老师的《零基础入门学习 Python》课程。
好啦,接下来实现核心程序 createBall():
先来生成蓝色球,即 1 到 16 中随机生成一个就好:def createBall():
blue = random.randint(1,16)
接下来就剩生成红色球号码了。
可以使用 while 循环结构,循环变量 i 表示生成次数,初值为 0,最大值为 6。
然后随机产生 1 到 33范围内的整数:
while i < 6:
red = random.randint(1,33)
由于红色球号码是随机生成的,因此有可能两次 while 循环中产生的红色球号码恰好相同。
这就不符合我们的要求了,因此要判断每次新生成的红色球号码是否与已生成的红色球号码不相同。
需要创建一个数组 realRed 来保存生成数,这样当不相同,则在 red 数组的相应位置保存该新生成的红色球号码。
否则就重新生成新的红色球号码:
realRed = [0] * 6
i = 0
while i < 6:
red = random.randint(1,33)
j = 0
while j < i:
if realRed[j] == red:
break
j += 1
if j == i:
realRed[j] = red
i += 1
最后在函数中输出结果:
print(f"红色球:{realRed} 蓝色球:{blue}")
运行一下:
搞定!如果彩票中奖了,记得请小师妹喝杯奶茶哦~~
源码:
|