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.xxx() 会共享同一个全局实例,容易被其他代码意外改变状态。推荐做法是:
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 友好