Python random模块基于梅森旋转算法生成伪随机数,适用于模拟等非密码学场景;提供random()、randint()等基础函数;需用seed()控制可复现性;多线程应使用独立Random()实例;密码学用途须改用secrets模块。

Python 的 random 模块是生成伪随机数的标准工具,适用于模拟、游戏、测试等常见场景。它基于梅森旋转算法(Mersenne Twister),默认周期长达 219937−1,足够满足绝大多数非密码学用途。
常用基础函数用法
这些函数最常被调用,适合快速生成不同类型的随机值:
-
random.random():返回 [0.0, 1.0) 区间内的浮点数 -
random.randint(a, b):返回 [a, b] 区间内的整数(含端点) -
random.uniform(a, b):返回 [a, b) 或 [b, a) 区间内的浮点数(自动判断大小) -
random.choice(seq):从非空序列中随机选一个元素 -
random.choices(population, weights=None, k=1):可重复抽样,支持加权 -
random.sample(population, k):无放回抽样,k 不能超过 population 长度
控制随机性:种子与状态管理
每次运行程序时 random 模块会自动用系统时间初始化状态,所以结果通常不同。若需可复现的结果(如调试、单元测试),应手动设置种子:
- 调用
random.seed(42)(数字、字节串或任意可哈希对象均可) - 也可用
random.setstate(state)和random.getstate()保存/恢复内部状态 - 注意:全局 random 实例是线程安全的,但多线程中建议为每个线程创建独立
random.Random()实例
使用独立随机实例避免干扰
在模块级或类中直接调用 random.xxx() 会共享同一个全局实例,容易被其他代码意外改变状态。推荐做法是:
立即学习“Python免费学习笔记(深入)”;
- 显式创建独立实例:
rng = random.Random(123) - 后续全部使用
rng.randint(1, 6)、rng.choice(...)等 - 尤其适合库开发、多线程环境或需要隔离随机行为的组件
不适用于密码学场景
random 模块生成的是伪随机数,**不可用于密码学目的**(如生成密钥、token、验证码盐值等):
- 应改用
secrets模块(Python 3.6+),例如secrets.token_hex(16)、secrets.choice() -
os.urandom()也是安全的底层接口,但封装不如secrets友好 - 混淆两者可能导致严重安全风险,务必区分用途










