Python中random模块的实际运用(第8节)


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后可以在字符串里面使用花括号“{}”括起来的变量和表达式,包含“{}”的表达式在程序运行时会被表达式的值代替。