2024年3月9日发(作者:)

使用Python进行随机生成、随机抽取、随机分组

日常办公中,我们经常会遇到诸如:随机抽取,随机分配,随机数生成等问题,这

些都和“随机”这个概念相关,在Python中主要通过random库内的方法来解决。今天

我们通过一些常用的库方法和简单案例,来掌握Python中随机数的使用方法。

首先,我们须要来了解一下在random库中,最高频使用的方法有哪些,而他们又

有什么作用?

一、Python中Random的常用的7个方法的简介

①random():随机生成一个0~1之间小数,精确到小数点后18位,含0不含1

②uniform(x,y):随机生成一个[x,y]之间的小数,包含x和y本身,含16位有效数字

③randint(x,y):随机生成一个[x,y]之间的整数,包含整数x和y本身

④randrange(a,b,[c]):随机生成一个a~b之间整数,含a不含b,其中c可选参数,表

示步长值

⑤choice(seqtype):随机从序列类型(如字典、元组、列表等)中返回1个元素

⑥shuffle(seqtype):将序列类型(同上)中元素随机洗牌乱序,返回乱序后序列

⑦sample(seq,m):从序列类型中随机选取m个元素返回(以列表形式)

关于开区间和闭区间的问题小结:

random和randrange方法右侧区间为开区间,取不到端点数值;

randint和uniform方法右侧是闭区间,可以取到端点数值。

在了解了以上的一些random库的基本方法以后,下面我们结合一些实际案例来看一下

如何使用它们。

【案例1:生成验证码(数字和字母组成)(randrange方法)】

①生成纯数字:随机生成6个0~10的整数(不含10)

import random

listA=[]

for i in range(6):

num=nge(0,10)

(num)

s="".join(listA)

print(s)

注:

方法为字符串合并方法,即把listA中的所有元素连接起来,双引号内为分隔

符,这里为空值,意为直接把所有的列表元素连接起来,不用任何分隔符;

2.所有随机方法都为random库中的方法,所以在使用前须要导入random库,而且在调

用其中的方法时,须要添加random前缀,如nge(1,10)。

②随机生成6个数字或大写字母的组合(字母和数字出现概率各50%)

import random

result=[]

for i in range(6):

b=nge(0,10)

if b<5:

num=nge(65,91)

(chr(num))

else:

num=nge(0,10)

(str(num))

s="".join(result)

print(s)

注:

①A~Z的ASCII值为65~90,由于是randrange方法,要取到90,右端必须写到91,因

为它的右侧是开区间;

②使用chr函数,把随机抽取的65~90之间的正整数转换为对应的大写字母;

③开始抽取的b值,主要是为了让字母类型和数字类型出现的概率各占50%,因为b<5

包含:0,1,2,3,4,而else对应的b>=5包含:5,6,7,8,9(注意取不到10)。

这样就保证了数字和字母类各占50%的概率。

【案例2:模拟随机从盒子中抽取一个球(choice方法)】

import random

Box=['红球','绿球','蓝球','黑球','白球','紫球']

draw=(Box)

print(draw)

注:

①一般来说,从一个序列类型中随机抽取一个,使用方法,如果是要抽

取2个以上,则使用方法;

②无论是还是,都可以直接赋值给变量,它们的返回值

都是抽取的结果。

【案例3:洗牌和抽牌(shuffle、sample方法)】

将手上扑克牌洗牌、并抽取3张牌:

import random

cards=['小鬼','黑桃A','方片5','红桃Q','梅花J','大鬼','方片2','梅花A','

红桃3']

e(cards)

draw=(cards,3)

print(Draw)

注:

①e方法的功能是:把列表内的元素洗牌,即随机排列顺序;

②方法的功能是:随机抽取在列表中随机抽取n个元素,类似

方法,但是可以指定抽取的元素的个数。

【案例4:猜数字游戏(randint方法)】

生成一个1~1000之间的正整数(含1000),然后根据让用户通过键盘输入猜数

字,如果猜错则给出对应的提示(大了或小了)并让用户继续猜,直到猜对则游戏结

束,并统计猜的次数。

import random

key=t(1,1000)

count=0

while True:

try:

answer=eval(input('请输入您猜的数字(1至1000):'))

except:

print('输入答案有误,请重新输入!')

continue

count+= 1

if answer > key:

print('太大啦!')

elif answer < key:

print('太小啦!')

else:

print('您答对了!')

break

print("你一共猜的次数为:", count)

注:

1.主流程使用While True-break语句控制,直到用户猜对之前,一直循环运行程序;

2.使用try-except语句检测用户输入的内容是否为数字,如果不是数字(触发错误),

则弹出提示,并使用continue语句跳回到程序开头继续重新运行主流程;

3.如果用户输入内容无误,则使用if分支语句对数字和设定的数字之间进行比较,根

据情况输出不同的提示语,如果走入猜对的分支,则弹出提示,并引发break结束主程

序。

【案例5:随机分配问题(choice方法)】

现在有3个房间和10个老师,假设每间房最多都可以装下10人,请随机分配,将

10个老师安排到随机的房间中。

import random

laoshi = ['A','B','C','D','E','F','G','H','I','J']

rooms = [[],[],[]]

for member in laoshi:

room = (rooms)

(member)

print(rooms)

注:

①这里使用了列表的嵌套,即“列表中含有列表”,外层列表表示三个房间的集合,而其

中的每一个空列表,表示一个房间;

②所谓的分配的思路就是:先随机抽取一个空房间,然后再放入一个老师,从第一个老

师开始,遍历到最后一个老师,分配任务就完成啦!

③采用本案例中的方法,每个老师被分配到每一个房间的可能性是相等的,如果是每个

房间只能容纳3个老师的情况就更复杂,方法也很多,比如可以利用e

和列表切片来完成等等。

【总结】

今天给大家讲解了python的random库中随机数相关的方法,涵盖了随机抽取,

乱序排列,随机分配等常用的问题。虽然本篇开头介绍了9个方法,但其实random库

中最常用的方法不超过五六个,都在案例中有所体现。需要注意的是,random库和序

列类型配合,可以实现一些复杂的功能,比如随机分组,随机抽取等等,如果涉及到更

加复杂的结构,则需要配合if语句,while循环等结构。总之,random在工作中是非

常实用的一个库。

那么大家都学会了吗?