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在工作中是非
常实用的一个库。
那么大家都学会了吗?
发布评论