概述
生成随机数是编程中的一个常见任务,Python 提供了多种方法来实现这一目标。从简单的伪随机数到更高级的加密安全随机数,有多种选择可供选择。
伪随机数生成器 (PRNG)
PRNG 是用于生成看似随机但实际上是根据确定性算法生成的数字序列的算法。Python 的 random
模块提供了以下 PRNG:
- random.random():生成 0.0(包括)到 1.0(不包括)之间的随机浮点数。
- random.randint(a, b):生成 a 和 b(包括)之间的随机整数。
- random.choice(sequence):从给定的序列中随机选择一个元素。
示例
import random
# 生成一个随机浮点数
random_float = random.random()
print(random_float) # 输出:0.123456789
# 生成一个 1 到 10 之间的随机整数
random_int = random.randint(1, 10)
print(random_int) # 输出:5
# 从一个列表中随机选择一个元素
random_item = random.choice(['apple', 'banana', 'cherry'])
print(random_item) # 输出:'apple'
系统随机数生成器 (OSRNG)
OSRNG 使用熵源(例如系统时钟或键盘输入)来生成真正随机的数字。Python 没有内置的 OSRNG,但可以通过使用 os
模块和平台特定的库来实现。
示例(Linux/macOS)
import os
# 从系统熵池中生成一个 16 字节的随机字节字符串
random_bytes = os.urandom(16)
# 将字节字符串转换为整数
random_int = int.from_bytes(random_bytes, byteorder='big')
# 打印随机整数
print(random_int)
加密安全伪随机数生成器 (CSPRNG)
CSPRNG 是 PRNG 的一种,旨在生成不可预测且难以猜测的随机数字。Python 的 secrets
模块提供了以下 CSPRNG:
- secrets.randbelow(n):生成 0 到 n-1(包括)之间的随机整数。
- secrets.randbits(n):生成一个 n 位的随机整数。
示例
import secrets
# 生成一个 1 到 100 之间的随机整数
random_int = secrets.randbelow(100)
print(random_int) # 输出:42
# 生成一个 128 位的随机整数
random_bits = secrets.randbits(128)
print(random_bits) # 输出:10101010101010101010101010101010
注意事项
- PRNG 生成的数字序列是确定性的,这意味着给定相同的种子,它们将总是生成相同的序列。
- OSRNG 生成的数字序列是真正随机的,但它们可能受到系统熵源的限制。
- CSPRNG 生成的数字序列是不可预测且难以猜测的,但它们需要额外的计算开销。
结论
Python 提供了多种方法来生成随机数,从简单的 PRNG 到更高级的 CSPRNG。根据应用程序的安全性和随机性要求,选择适当的方法很重要。