17370845950

Python随机数生成_random模块说明【指导】
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() 会共享同一个全局实例,容易被其他代码意外改变状态。推荐做法是:

  • 显式创建独立实例: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 友好
  • 混淆两者可能导致严重安全风险,务必区分用途