Python random模块常用方法详解:从随机数到序列操作
本文详细介绍Python标准库random模块的核心方法。涵盖生成随机整数(randint、randrange)、浮点数(random、uniform)、从序列中随机选取单个元素(choice)及带权重的多次选取(choices),以及无放回抽样(sample)和序列洗牌(shuffle)。通过代码示例解析参数含义与使用场景,帮助开发者高效掌握随机数据处理技巧。
Python random模块概述
前言
Python内置的random模块提供了多种随机数生成器,是处理随机性任务的基础工具。
作为Python标准库的一部分,random模块无需额外安装,直接导入即可使用。本文将系统梳理该模块中高频使用的方法及其具体用法。
生成随机整数与浮点数
一、生成随机的整数
# coding=utf-8
import random
print(random.randint(1, 5))
print(random.randrange(0, 51, 5))
运行结果:
3 40
randint(start, end)函数用于生成一个介于start和end之间的随机整数。需要注意的是,该函数采用的是左闭右闭区间,即返回值可能包含end值。这与Python中常见的左闭右开区间习惯有所不同,使用时需特别注意边界情况。
randrange(start, end, step)函数则基于range(start, end, step)生成的序列,从中随机返回一个值。该方法遵循左闭右开原则,例如若将上述代码中的51改为50,则返回值绝不可能为50。
由于随机性的本质,每次执行代码都会得到不同的结果。
二、生成随机的小数
print(random.random())
print(random.uniform(2, 5))
运行结果:
0.49541524802465897 2.948656863619216
random()函数返回一个[0, 1)区间内的随机浮点数。
uniform(start, end)函数返回[start, end]区间内的任意浮点数。其底层实现逻辑大致为将random()的结果乘以(end-start)并进行偏移,从而覆盖指定区间。
随机选取单个元素与带权重复选取
三、从字符串、列表、元组中随机返回一个值
choice_str = 'python'
print(random.choice(choice_str))
choice_list = [i for i in range(1, 6)]
print("choice_list: ", choice_list)
print(random.choice(choice_list))
choice_tuple = (10, 20, 30, 40, 50)
print(random.choice(choice_tuple))
运行结果:
h choice_list: [1, 2, 3, 4, 5] 5 20
choice()函数用于从可迭代对象中随机选取一个元素。它支持列表、元组和字符串,但不支持字典和集合类型。
四、从字符串、列表、元组中随机返回一次或多次,且设置权重
choice_list = [i for i in range(1, 6)]
print("choice_list: ", choice_list)
print(random.choices(choice_list))
choice_tuple = (10, 20, 30, 40, 50)
print(random.choices(choice_tuple, k=2))
choice_str = 'python'
print(random.choices(choice_str, weights=[0.5, 0, 0.5, 0, 0, 0], k=7))
print(random.choices(choice_str, cum_weights=[0, 0.5, 0.5, 1, 1, 1], k=7))
运行结果:
choice_list: [1, 2, 3, 4, 5] [4] [20, 50] ['t', 'p', 't', 'p', 'p', 't', 't'] ['h', 'y', 'h', 'h', 'h', 'h', 'y']
choices(population, weights=None, cum_weights=None, k=1)函数允许从可迭代对象中随机选取一次或多次元素,并以列表形式返回结果。
weights参数用于指定每个元素对应的权重列表,默认为None(即所有元素权重相等)。当传入权重列表时,其长度必须与可迭代对象长度一致,且索引一一对应。权重值可以是任意可比较大小的数字,系统会根据权重大小计算各元素被选中的概率。例如在示例中,由于其他字符权重为0,因此只会返回“python”中的p和t。
cum_weights参数用于指定累计权重列表,同样默认为None。传入时长度也必须匹配。累计权重指当前位置之前所有元素权重之和加上当前元素权重,因此列表中的值必须是非递减的。系统依据累计权重计算概率,如示例中仅返回“python”中的y和h,因为其他字符累计权重为0。
注意:weights和cum_weights不能同时提供有效值,即使计算结果相同,系统也会报错。
k参数指定从可迭代对象中获取值的次数。每次抽取独立进行,因此理论上k次抽取可能全部命中同一个元素。
无放回抽样与序列洗牌
五、从字符串、列表、元组中随机获取一个或多个值
sample_list = [i for i in range(1, 6)]
print("sample_list: ", sample_list)
print(random.sample(sample_list, 1))
sample_tuple = (10, 20, 30, 40, 50)
print(random.sample(sample_tuple, 2))
sample_str = 'python'
print(random.sample(sample_str, 3))
运行结果:
sample_list: [1, 2, 3, 4, 5] [1] [10, 40] ['p', 'h', 'o']
sample(population, k)函数从可迭代对象中随机抽取k个不重复的元素,返回一个列表。
k参数表示返回元素的个数,该参数无默认值,必须显式传入。与choices不同,sample是一次性从对象中取出k个元素,确保每个元素不被重复抽取。此外,k值不能大于可迭代对象的长度,否则将引发错误;而choices中的k值理论上可以无限大,只要资源允许。两者适用场景不同,使用时需仔细区分。
六、随机打乱顺序
cards = ['%s-%s' % (a, b) for a in ['Spade', 'Heart', 'Diamond', 'Club'] for b in
([str(i) for i in range(3, 11)] + [j for j in 'JQKA2'])] + ['Black joker', 'Red joker']
print("Before: ", cards)
random.shuffle(cards)
print("After: ", cards)
运行结果:
Before: ['Spade-3', 'Spade-4', 'Spade-5', 'Spade-6', 'Spade-7', 'Spade-8', 'Spade-9', 'Spade-10', 'Spade-J', 'Spade-Q', 'Spade-K', 'Spade-A', 'Spade-2', 'Heart-3', 'Heart-4', 'Heart-5', 'Heart-6', 'Heart-7', 'Heart-8', 'Heart-9', 'Heart-10', 'Heart-J', 'Heart-Q', 'Heart-K', 'Heart-A', 'Heart-2', 'Diamond-3', 'Diamond-4', 'Diamond-5', 'Diamond-6', 'Diamond-7', 'Diamond-8', 'Diamond-9', 'Diamond-10', 'Diamond-J', 'Diamond-Q', 'Diamond-K', 'Diamond-A', 'Diamond-2', 'Club-3', 'Club-4', 'Club-5', 'Club-6', 'Club-7', 'Club-8', 'Club-9', 'Club-10', 'Club-J', 'Club-Q', 'Club-K', 'Club-A', 'Club-2', 'Black joker', 'Red joker'] After: ['Spade-3', 'Diamond-J', 'Club-8', 'Club-7', 'Diamond-10', 'Spade-J', 'Heart-J', 'Diamond-A', 'Spade-K', 'Spade-10', 'Spade-8', 'Club-10', 'Club-J', 'Heart-9', 'Diamond-4', 'Diamond-5', 'Red joker', 'Spade-5', 'Club-4', 'Club-Q', 'Heart-7', 'Spade-Q', 'Club-A', 'Spade-6', 'Diamond-6', 'Black joker', 'Spade-7', 'Heart-Q', 'Club-9', 'Club-3', 'Heart-K', 'Diamond-Q', 'Diamond-K', 'Spade-2', 'Heart-5', 'Heart-A', 'Heart-4', 'Heart-3', 'Diamond-7', 'Club-K', 'Diamond-9', 'Spade-4', 'Heart-2', 'Spade-A', 'Club-6', 'Club-2', 'Heart-8', 'Diamond-2', 'Heart-10', 'Heart-6', 'Club-5', 'Spade-9', 'Diamond-8', 'Diamond-3']
shuffle()函数用于将可迭代对象的元素顺序随机打乱。示例中模拟了一副扑克牌的洗牌过程。
注意:shuffle()函数没有返回值,它直接修改原可迭代对象的顺序。
除了上述方法,random模块还提供了基于数学分布(如正态分布、指数分布等)生成随机数据的功能。由于random模块源码相对简洁,方法数量有限且易于理解,感兴趣的用户可在PyCharm中按住Ctrl键点击模块名查看源码细节。
总结
本文介绍了Python中random模块的常用方法。如需了解更多相关技巧,建议查阅本站往期文章或继续关注后续更新。感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













