python中的random模块是用于生成随机数的一个模块,经常被使用。random模块在pandas,numpy等数据处理模库中也含有,但是跟直接的random模块可能会存在一些细微的差别。
更简单直观的可以看这篇博客:https://blog.csdn.net/ckk727/article/details/99548223
单个随机元素生成
生成随机整数
a=random.randint(0,10) #生成范围内的随机整数,左右都是闭区间。
#np中的random.randint是左闭右开区间
b=random.randrange(0,10,2) #在范围内按照间隔生成的整数中随机选取一个
print(a,b)
#out: 5,4
生成随机实数
c=random.random() #生成[0,1)内的随机浮点数
d=random.uniform(1.1,2.1) #生成范围内的随机实数,左闭右开区间
print(c,d)
#out: 0.5535116341042495,1.7773505872209385
随机挑选
s={'a':1,'b':2,'c':3}
e=random.choice(range(1,5)) #从序列中随机选取一个元素
f=random.choice(list(s.items())) #在把字典转化为列表的迭代器中选取
print(e,f)
#out: 41,('b', 2),
choice()函数的作用对象必须是序列对象,比如列表,元组,字符串。而字典跟集合不是序列对象,但是是可迭代对象。
打乱排序
ss=[1,2,3,4,5]
random.shuffle(ss) #打乱原迭代器内顺序,直接改变原数组,没有返回值
sx=random.shuffle(ss)
print(s,ss)
#out: [1, 2, 4, 5, 3] None
shuffle()打乱原序列对象,直接改变原序列,没有返回值
批量随机数生成
random通常从某种分布中挑选一个数,要批量生成通常跟for循环以及range()函数连用
生成批量随机数
lst=list(random.randint(0,10) for _ in range(10))
print(lst)
#out: [5, 8, 0, 7, 6, 7, 5, 8, 2, 6]
lst2=list(round(random.uniform(1.1,2.1),2) for _ in range(5))
print(lst2)
#out: [1.99, 1.25, 1.33, 1.45, 1.39]
批量随机挑选
choices()跟sample()函数都能实现随机抽样,但是一个是又放回的抽取k个,另一个是一次性抽取k个,相当于无放回的抽样。
choices()
random.choices(population,weights=None,*,cum_weights=None,k=1)
choices()函数有三个可选参数,weights,每个元素选取的相对权重,cum_weights累计权重,k抽取个数,默认为1
import random
a = [1,2,3,4,5]
#1
print(random.choices(a,k=5))
#2
print(random.choices(a,weights=[0,0,1,0,0],k=5))
#3
print(random.choices(a,weights=[1,1,1,1,1],k=5))
#4
print(random.choices(a,cum_weights=[1,1,1,1,1],k=5))
多运行几次的话就能看出结果的差别了
#1 : 重复输出10次列表a中的各个成员出现概率基本持平。
#2 : 重复输出10次每次输出均得到[3,3,3,3,3]结果。
#3 : 重复输出10次列表a中的各个成员出现概率基本持平。
#4 : 重复输出10次每次输出均得到[1,1,1,1,1]结果。
sample()
sample()函数包含两个参数,第一个序列目标,第二个抽取个数,不能缺少
import random
lst=list(range(10))
lst1=random.sample(lst,5)
print(lst,lst1)
#out:
#[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# [7, 8, 2, 0, 1]
我们看看这两个函数对字符串的操作
strs='abcdefg'
str1=random.choices(strs,k=3)
str2=random.sample(strs,3)
print(str1,str2)
#out: ['c', 'a', 'f'] ['b', 'c', 'e']
输出的都是列表