完整版下载 | 超详细Python算法案例讲解100例.zip-Python文档类资源-CSDN下载 |
1.问题描述
编写程序模拟福利彩票的双色球开奖过程,由程序产生出6个红色
球和1个蓝色球。
要求:
1)每期开出的红色球号码不能重复,但蓝色球可以是红色球中的
一个。
2)红色球的范围是1~33,蓝色球的范围是1~16。
3)输出格式为“红色球:x x x x x x 蓝色球:x”。
2.问题分析
由问题描述可知,该问题是编程来模拟福利彩票中双色球开奖过
程,因此需要随机生成6个红色球号码和1个蓝色球号码,显然需要使
用Python语言中的random模块来生成随机数。
由题目要求可知“每期开出的红色球号码不能重复”,而使用随机
函数并不能保证每次产生的随机数都不相同,因此在程序设计时需要
判断每次新生成的红色球号码是否和已生成的红色球号码相同,如果
有重复,则需要重新生成新的红色球号码。
3.算法设计
随机生成6个不同红色球号码的功能可使用循环结构来实现。我们
使用数组来保存生成的6个红色球号码。在循环体中需要判断每次新生
成的红色球号码是否与已生成的红色球号码重复。
由于蓝色球号码只有1个,而且可以与红色球的号码重复,因此可
以直接使用随机函数来生成蓝色球号码,并保存在变量中。
4.确定程序框架
(1)产生随机数
产生1~33范围内的随机整数,代码如下:
tmp = random.randint(1, 33)
(2)随机产生红色球号码
定义red数组来保存产生的红色球号码。由题意可知,需要随机产
生6个红色球号码,因此可以使用red数组中下标为0~5的6个元素来保
存红色球号码。
随机产生红色球号码的过程使用while循环结构,循环变量为i,i初
值为0,i<6,在循环体中随机生成不同的红色球号码。需要注意的是,
因为红色球号码是随机生成的,因此有可能两次while循环中产生的红
色球号码恰好相同,这就要求在循环体中必须有相应的代码来判断每
次新生成的红色球号码是否与已生成的红色球号码不相同。如果不相
同,则在red数组的相应位置保存该新生成的红色球号码,否则应该重
新生成新的红色球号码。代码如下:
red = [1] * 6 # 定义red数组,保存随机生成的6个红色球号码,号码范围为1~33
i = 0
# 随机生成6个红色球号码
while i < 6:
tmp = random.randint(1, 33)
j = 0
while j < i:
# 判断已生成的红色球号码是否与当前while循环中产生的随机红色球号码相同
# 如果相同,则重新生成新的红色球号码,否则在red[i]中保存新生成的红色球号码
if red[j] == tmp:
break
j += 1
if j == i:
red[i] = tmp # 将新生成的红色球号码保存在red数组中
i += 1
程序流程图如图12.9所示。
5.完整的程序
根据上面的分析,编写程序如下:
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 双色球 红色球范围1~33,6个; 蓝色球范围1~16,1个
import random
if __name__ == "__main__":
red = [1] * 6 # 定义red数组,保存随机生成的6个红色球号码,号码范围为1~33
i = 0
# 随机生成6个红色球号码
while i < 6:
tmp = random.randint(1, 33)
j = 0
while j < i:
# 判断已生成的红色球号码是否与当前while循环中产生的随机红色球号码相同
# 如果相同,则重新生成新的红色球号码,否则在red[i]中保存新生成的红色球号码
if red[j] == tmp:
break
j += 1
if j == i:
red[i] = tmp # 将新生成的红色球号码保存在red数组中
i += 1
blue = random.randint(1, 16) # 随机生成蓝色球号码
print("本期的开奖号码是:")
print("红色球:", end=" ")
for i in range(6):
print("%d" % red[i], end=" ")
print(" 蓝色球:%d" % blue)
6.运行结果
在PyCharm下运行程序,运行三次,每次都生成了不同的红色球和
蓝色球序列,结果如图12.10所示。