random 是 Python 的一个常用的内置模块,模块提供了生成随机数的功能,包含了多种生成随机数的函数,比如生成随机整数、随机浮点数、从序列中随机选择元素等。
使用 random模块
要使用 random模块,直接导入它即可。
import random
以下是random模块提供的主要函数:
常用方法介绍:
1. random()
生成一个[0.0, 1.0)范围内的不包含整数1随机浮点数(大于等于0,小于1的小数)。
测试代码:
print(random.random())
执行后结果:
0.3336493107060039
如果想保留小数,可以用round函数或者decimal.Decimal函数
1)使用round函数保留几位小数,在round第2个参数中传入数字几,比如保留3位小数
print(round(random.random(),3))
2)使用Decimal函数,保留3位小数
from decimal import Decimal
print(Decimal(str(random.random())).quantize(Decimal('0.000')))
Decimal模块的用法可参见之前的文章:浮点数精度介绍
2. randint(a, b)
生成一个指定范围内的随机整数,包括a和b的值
测试代码:
print(random.randint(1,100))
多次执行后结果:
69
19
67
3 randrange(start, stop=None, step=1)
从指定的范围内返回一个随机整数,类似于range()函数。randint函数其实调用的也是该函数。
关于参数:
- 如果不传stop和step参数,start参数必须大于0,否则报错。此时会随机生成比start小的整数。
- 如果不传stop,传的step参数必须等于1,否则会报错。
- 如果传了stop和step参数,step不等于1时则随机生成一个start和stop之间步长为step的整数。step=1时生成在start和stop之间,并且小于stop的数(不同于randint函数)
具体的按照step计算方式参考源代码:
测试代码:
#随机生成1到1000步长为10的整数
print(random.randrange(1,1000,10))
#随机生成5到99之间的整数
print(random.randrange(5,100))
#随机生成小于100的整数
print(random.randrange(100))
4. choice(seq)
从非空序列seq中随机选取一个元素。seq是支持切片的对象,比如列表list,元组tuple,字符串str,字节串bytes等。
测试代码:
seq_list = [1,2,3]
print(random.choice(seq_list))
5 random.choices(population, weights=None, *, cum_weights=None, k=1)
从给定的序列中随机选择1个或者多个元素,返回的是列表list;我们可以指定每个元素被选中的概率,或者指定要选择的元素数量。该函数在Python 3.6及更高版本中才支持。
参数:
- population:一个支持切片的序列,用于从中随机选择元素。
- weights(可选):一个序列,指定了population中每个元素被选中的相对概率;weights的长度需要等于population的长度;默认情况下,所有元素的选中概率是相等的。
- k(可选):一个整数,指定要选择的元素数量。默认为1。K可以大于序列的长度。
- cum_weights(可选):一个序列,用于指定累积权重。cum_weights的长度需要等于population的长度;如果提供了cum_weights,则不能传weights,否则报错;累积权重的值应该由小到大。
测试代码:
# 示例1:从列表中随机选择两个元素
print(random.choices(seq_list, k=2))
# 示例2:从列表中随机选择4个元素 元素会重复
print(random.choices(seq_list, k=6))
# 示例3:指定权重
weights = [1, 3, 1,1,1] # 数字2被选中的概率是其他数字的三倍
print(random.choices(seq_list, weights=weights, k=2))
# 示例4:使用累积权重 值由小到大
cum_weights = [3, 4, 5,10,20]
print(random.choices(seq_list, cum_weights=cum_weights, k=2))
# 示例5:使用累积权重 权重值由大到小
cum_weights = [20, 10, 5,3,1]
print(random.choices(seq_list, cum_weights=cum_weights, k=2))
结果:前4个每次执行结果可能不同,最后一个因为权重设置问题每次都是结果[1,1]
[4, 5]
[2, 3, 4, 3, 4, 2]
[2, 1]
[1, 5]
[1, 1]
6 shuffle(x,random=none)
用于打乱序列x的元素。函数会直接修改序列x,没有return。
参数:
- x : 支持切片的序列
- random:默认为none,也可以传random.random函数。不过该参数从Python 3.9开始,将在后续版本中删除。
测试代码:
seq_list = [1,2,3,4,5]
random.shuffle(seq_list)
print(seq_list)
random.shuffle(seq_list,random.random)
print(seq_list)
结果:
[1, 3, 5, 4, 2]
[5, 2, 1, 4, 3]
7 sample(population, k,*,counts=None)
从指定的序列population中随机获取k个不重复的元素,并返回一个list。
参数:
- population:一个支持切片的序列,用于从中随机选择元素。
- k:一个整数,指定要选择的元素数量。K不能大于序列的长度。
- counts:可以指定序列population中元素重复的次数;传入的是一个数字元素的序列,序列长度跟population一致;数字越大,元素重复的次数变多,意味着被随机到的概率也会变大,也会返回相同的元素;如果不带这个参数,返回的元素不会重复。
举例:
seq_list = [1,2,3]
counts = [2,2,1]
上述seq_list 等同于[1,1,2,2,3], 第1个和第2个元素重复2次。
测试代码:
seq_list = [1,2,3,4,5]
#随机返回2个元素
print(random.sample(seq_list,2))
#每个元素重复2次,随机返回2个元素
print(random.sample(seq_list,2,counts=[2,2,2,2,2]))
8 randbytes(n)
随机生成n个字节的字节码。
测试代码:
print(random.randbytes(20)) #20个字节
结果:
b'\xff\x19\xb7*{\x88\x9d\xb5\xea-\x10\x1dA}\xa9\xce\xaf$\xf8\x0f'
9 getrandbits(k)
随机生成k个比特位bit(1个字节=8的比特位),返回一个在范围在[0, 2**k) 范围内的随机整数。上面的randbytes函数调用的就是该函数。
测试代码:
print(random.getrandbits(20))
结果: 每次执行结果不同
503161
10 seed(a=None,version=2)
设置a等于某个值时,确保每次运行程序时生成的随机数序列都是相同的。保持默认值,每次运行程序时生成的随机数序列可能会不同。
测试代码:
random.seed('a')
print(random.randbytes(20))
print(random.getrandbits(20))
每次执行后结果都一样
11 uniform(a,b)
生成一个在指定范围内[a, b](包含a和b)的随机浮点数。a和b可以是整数或者浮点数。
测试代码:
print(random.uniform(0.1,10))
执行后返回的浮点数每次都不同
3.1062124017808896
12 其他几个函数
- normalvariate(mu,sigma): 返回一个符合正态分布(均值为mu,标准差为sigma)的随机浮点数。
- gauss (mu,sigma): 同normalvariate功能。
- triangular(low=0.0, high=1.0, mode=None): 返回一个生成三角形分布的随机数。
- lognormvariate(mu,sigma): 返回一个符合对数正态分布(均值为mu,标准差为sigma)的随机浮点数。
- expovariate(lambd)函数用于生成一个符合指数分布的随机浮点数。lambd必须是大于0的浮点数。
- vonmisesvariate(mu, kappa)函数用于生成一个符合冯·米塞斯(Von Mises)分布的随机浮点数。
- gammavariate(alpha, beta)函数用于生成一个符合伽马(Gamma)分布的随机浮点数。
- betavariate(alpha, beta)函数用于生成一个符合贝塔(Beta)分布的随机浮点数。
- paretovariate(alpha)函数用于生成一个符合帕累托(Pareto)分布的随机浮点数。
- paretovariate(alpha, beta)函数用于生成威布尔(Weibull)分布的随机数。
内容比较多,欢迎大家点赞收藏后学习。
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
-----指水滴不断地滴,可以滴穿石头;
-----比喻坚持不懈,集细微的力量也能成就难能的功劳。
----感谢读者的阅读和学习,谢谢大家。