Python中的random模块可以应用在许多场景,比如随机选取样本、抽奖、洗牌、随机排序等。
1、random模块用于抽奖例子
在我们的实际生活中,经常会碰到一些抽奖的小活动,现在我们使用random模块编写一个抽奖的小程序。
抽奖描述:
1、定义一个礼品列表,包含5个奖项 “谢谢参与”、“一把雨伞” 、“一个电饭煲”、“一部手机”、 “一台电视机”。
2、“谢谢参与”的概率为50%。
3、“一把雨伞”中奖概率为25%。
4、“一个电饭煲”中奖概率为15%。
5、“一部手机”中奖概率为8%。
6、“一台电视机”中奖概率为2%。
动手练一练:
import random
gifts = ["谢谢参与", "一把雨伞" , "一个电饭煲", "一部手机", "一台电视机"]
def win():
number = random.randrange(0, 100, 1)
if 0 <= number <= 50:
print(gifts[0])
elif 50 < number <= 75:
print("恭喜你中奖了!你获得了:", gifts[1])
elif 75 < number <= 90:
print("恭喜你中奖了!你获得了:", gifts[2])
elif 90 < number <= 98:
print("恭喜你中奖了!你获得了:", gifts[3])
else:
print("恭喜你中奖了!你获得了:", gifts[4])
if __name__ == "__main__": # 该“.py”文件作为脚本直接执行
win()
执行以上代码,输出结果为:
谢谢参与
上面的例子中,这种方法就是我们利用random模块通过一种概率实现抽奖的效果,可以看出random模块可以快速帮我们随机抽取一些数字,进行一些随机的处理。
2、random模块模拟抽牌游戏
目前,扑克是流行全世界的一种纸牌。一副扑克牌有54张牌,其中52张是正牌,另2张是王牌(大王和小王)。我们可以使用random模块编写一个简单的抽牌游戏,下面是一个示例程序,首先生成了54张扑克牌,然后借助于随机数从中抽取6张牌。
动手练一练:
import random #导入random模块
a = ["黑桃","红心","方片","梅花"] #四种花色
b = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"] #13种牌面
#将花色与牌面组合并加上大小王,生成54张牌的列表
cards = [x+y for x in a for y in b] + ["大王", "小王"]
#将54张牌的列表顺序打乱
random.shuffle(cards)
result = [] #创建空列表
for i in range(6): #循环6次,共取6张牌
count = random.randint(0,len(cards)-1) #生成一个0到剩余牌数-1的随机数
c = cards.pop(count) #pop()函数将指定下标的牌取出
result.append(c) #取出的牌添加至持牌列表
result.sort() #持牌列表排序
print(result) #打印出随机6张牌
执行以上代码,输出结果为:
['方片10', '方片2', '梅花7', '红心9', '黑桃3', '黑桃J']
上面的例子中,每次运行都会随机打印6张牌。其实上面的例子还可以简化过程,从cards中随机抽出6张牌可以不用循环,利用random.shuffle(cards)打乱顺序后,可以直接使用列表的切片得到cards列表中前6张牌。例如:
动手练一练:
import random #导入random模块
a = ["黑桃","红心","方片","梅花"] #四种花色
b = ["A","2","3","4","5","6","7","8","9","10","J","Q","K"] #13种牌面
#将花色与牌面组合并加上大小王,生成54张牌的列表
cards = [x+y for x in a for y in b] + ["大王", "小王"]
#将54张牌的列表顺序打乱
random.shuffle(cards)
print(cards[:6]) # 使用列表切片得到cards中前6张牌
执行以上代码,输出结果为:
['红心Q', '梅花9', '红心6', '黑桃A', '红心4', '红心8']
3、random模块模拟双色球开奖
众所周知,彩票号码的摇号完全是随机的,我们可以采用Python函数中的random函数进行模拟。以双色球为例子:双色球分为红球和蓝球,针对红球,需要选择6个数字,范围是1到33;针对蓝球,只需要选择1个数字,范围是1到16,模拟双色球开奖,我们用很少的代码就可以做到。例如:
动手练一练:
import random
# 模拟双色球开奖(红球6个,蓝球1个)
def Lottery():
red = set() # 创建一个空集合,用于存储红球号码,可以确保不重复
while len(red) < 6: # 当red集合中元素的个数为6时,不满足循环条件就会结束循环
a = random.randint(1, 33) # 在1到33之间(包括1和33)生成一个随机的整数
red.add(a) # 生成的号码添加至red集合中
blue = random.randint(1, 16) # 蓝球号码在1到16之间(包括1和16)生成一个随机的整数
# 返回抽取的红球号码列表和蓝球号码
return list(red), blue # list()函数可以把red集合转换成red列表
# 模拟双色球6期开奖
for i in range(6):
red, blue = Lottery() # 在Lottery()中return返回的两个值分别赋值给red和blue
print(f"双色球第{i+1}期开奖结果: 红球 {sorted(red)}, 蓝球 {blue}")
执行以上代码,输出结果为:
双色球第1期开奖结果: 红球 [8, 9, 16, 18, 29, 33], 蓝球 10
双色球第2期开奖结果: 红球 [6, 14, 17, 21, 23, 32], 蓝球 15
双色球第3期开奖结果: 红球 [3, 5, 9, 12, 28, 29], 蓝球 2
双色球第4期开奖结果: 红球 [1, 5, 7, 12, 18, 23], 蓝球 3
双色球第5期开奖结果: 红球 [6, 10, 14, 21, 24, 33], 蓝球 11
双色球第6期开奖结果: 红球 [2, 8, 12, 15, 17, 27], 蓝球 12
上面的例子中,我们首先定义了一个Lottery()函数,它负责模拟抽取双色球的号码。例子中使用了集合来存储随机生成的红球号码,因为集合是一个不重复的元素序列,所以确保不会重复。然后,利用while循环抽取红球,直到抽到6个不同的号码结束循环。接着,抽取蓝球号码,并将结果以列表和单个数字的形式返回。代码的最后,模拟6次开奖,并使用print(f"{}")方法打印出每次的开奖结果。注意:print(f"{}")中f的后面一定要紧跟字符串,不能隔有空格,否则会报错。print(f"{}")的主要作用就是格式化字符串,加f后可以在字符串里面使用花括号“{}”括起来的变量和表达式,包含“{}”的表达式在程序运行时会被表达式的值代替。