Python生成随机数主要依赖random模块,该模块提供生成伪随机数的多种方法,包括random()、uniform()、randint()等函数用于生成浮点数和整数,choice()、sample()、shuffle()用于序列操作,并可通过seed()设置种子实现可重现性;需注意其生成的是伪随机数,不适用于安全场景,应使用secrets模块替代;在大数据量下推荐使用NumPy提升性能。

Python生成随机数主要依赖其内置的
random
在Python中,生成随机数的核心在于
random
首先,最基础的莫过于生成浮点数。
random.random()
[0.0, 1.0)
random.uniform(a, b)
[a, b]
[a, b)
对于整数,我们有几个选择。
random.randint(a, b)
[a, b]
b
random.randrange(start, stop, step)
[start, stop)
step
立即学习“Python免费学习笔记(深入)”;
当我们需要从一个序列(如列表、元组或字符串)中随机选择元素时,
random.choice(sequence)
random.sample(population, k)
population
k
random.shuffle(x)
x
值得一提的是,所有这些“随机数”其实都是伪随机数。它们是通过一个确定性算法生成的,只是看起来随机而已。这个算法的起始点就是“种子”(seed)。通过
random.seed(a=None)
import random
# 生成一个 [0.0, 1.0) 范围的浮点数
print(f"随机浮点数 (0.0, 1.0): {random.random()}")
# 生成一个 [10.0, 20.0] 范围的浮点数
print(f"随机浮点数 (10.0, 20.0): {random.uniform(10.0, 20.0)}")
# 生成一个 [1, 10] 范围的整数 (包含10)
print(f"随机整数 (1, 10): {random.randint(1, 10)}")
# 生成一个 [0, 10) 范围的、步长为2的整数 (即0, 2, 4, 6, 8)
print(f"随机整数 (0, 10, step=2): {random.randrange(0, 10, 2)}")
# 从列表中随机选择一个元素
my_list = ['apple', 'banana', 'cherry', 'date']
print(f"从列表中随机选择: {random.choice(my_list)}")
# 从列表中随机选择3个不重复的元素
print(f"从列表中随机选择3个: {random.sample(my_list, 3)}")
# 打乱列表顺序
random.shuffle(my_list)
print(f"打乱后的列表: {my_list}")
# 设置种子以重现随机序列
random.seed(42) # 每次运行,如果种子是42,下面的randint结果会一样
print(f"设置种子后的随机整数: {random.randint(1, 100)}")
random.seed(42)
print(f"再次设置种子后的随机整数: {random.randint(1, 100)}")这是一个非常好的问题,也是我在初学时就困惑过的地方。答案是:不,Python的
random
伪随机数是通过一个确定性的算法生成的数列,这个数列看起来是随机的,但实际上是完全可预测的,只要你知道它的起始状态——也就是“种子”(seed)。想象一下,你有一本非常厚的随机数书,每次你从某一页开始读,接下来的数字序列都是固定的。这个“起始页码”就是种子。
Python的
random
/dev/urandom
random.seed(123)
为什么我们需要伪随机数?
我个人认为,伪随机数在绝大多数应用场景下已经足够了,甚至比真随机数更有优势:
伪随机数的局限性:
最大的局限性在于其可预测性。如果攻击者能够获取到你使用的种子,或者通过观察足够多的随机数来推断出生成器的内部状态,那么他们就能预测接下来的所有“随机数”。这对于加密、安全令牌生成、密码学密钥等领域是致命的。
因此,如果你需要用于安全敏感的场景,比如生成密码、安全令牌或加密密钥,绝对不能使用random
secrets
secrets
secrets
random
生成特定范围或分布的随机数是数据模拟、统计分析和游戏开发中常见的需求。
random
1. 特定范围内的均匀分布:
random.randint(a, b)
[a, b]
a
b
import random
# 生成一个 [10, 20] 之间的整数
print(f"10到20之间的整数: {random.randint(10, 20)}")random.uniform(a, b)
[a, b]
[a, b)
import random
# 生成一个 [5.0, 15.0] 之间的浮点数
print(f"5.0到15.0之间的浮点数: {random.uniform(5.0, 15.0)}")2. 常用统计分布:
random
正态分布(高斯分布):
random.gauss(mu, sigma)
mu
sigma
mu
import random
# 生成一个均值为0,标准差为1的正态分布随机数
print(f"正态分布 (mu=0, sigma=1): {random.gauss(0, 1)}")
# 生成一个均值为100,标准差为15的正态分布随机数 (比如模拟IQ分数)
print(f"正态分布 (mu=100, sigma=15): {random.gauss(100, 15)}")我个人觉得,
gauss
指数分布:
random.expovariate(lambd)
lambd
import random
# 生成一个平均时间间隔为5的指数分布随机数 (lambda = 1/5 = 0.2)
print(f"指数分布 (lambda=0.2): {random.expovariate(0.2)}")伽马分布、贝塔分布等:
random
random.gammavariate(alpha, beta)
random.betavariate(alpha, beta)
random.lognormvariate(mu, sigma)
import random
# 伽马分布
print(f"伽马分布 (alpha=1, beta=2): {random.gammavariate(1, 2)}")
# 贝塔分布
print(f"贝塔分布 (alpha=0.5, beta=0.5): {random.betavariate(0.5, 0.5)}")3. 从自定义权重分布中选择:
有时候我们可能需要从一个序列中选择元素,但每个元素被选中的概率不同。
random.choices(population, weights=None, k=1)
choices
choice
import random
# 模拟抽奖,不同奖品中奖概率不同
prizes = ['一等奖', '二等奖', '三等奖', '谢谢参与']
weights = [0.05, 0.15, 0.30, 0.50] # 对应每个奖品的权重
# 抽一次奖
print(f"带权重随机选择 (一次): {random.choices(prizes, weights=weights, k=1)}")
# 模拟100次抽奖
results = random.choices(prizes, weights=weights, k=100)
from collections import Counter
print(f"100次抽奖结果统计: {Counter(results)}")我个人觉得
random.choices
即使
random
1. 常见的陷阱:
安全敏感场景误用random
random
random
secrets
secrets
import random
import secrets
# 错误示范:用于生成密码,可预测性高
# print(f"不安全的密码: {random.randint(100000, 999999)}")
# 正确做法:使用secrets模块生成安全的随机数或令牌
print(f"安全的一次性密码 (OTP): {secrets.randbelow(1000000):06d}") # 生成6位数字OTP
print(f"安全的随机令牌: {secrets.token_hex(16)}") # 生成16字节的十六进制令牌我个人觉得,这个区分是至关重要的,对安全性的理解不能有丝毫含糊。
random.seed()
random.seed(some_fixed_value)
random.seed()
random.seed()
randint(a, b)
randint(a, b)
b
nextInt(n)
[0, n)
range()
randrange()
[start, stop)
random.shuffle()
random.shuffle(x)
x
None
new_list = list_to_shuffle[:]
new_list
shuffle
random.sample(list_to_shuffle, len(list_to_shuffle))
2. 性能考量:
对于大多数日常应用,
random
random
NumPy的随机数生成: 如果你在进行大量的数值计算,特别是涉及数组操作,NumPy库的
numpy.random
random
import numpy as np
import time
start_time = time.time()
# 使用Python的random生成100万个随机浮点数
# python_random_numbers = [random.random() for _ in range(1_000_000)]
# print(f"Python random耗时: {time.time() - start_time:.4f}秒")
start_time = time.time()
# 使用NumPy生成100万个随机浮点数
numpy_random_numbers = np.random.rand(1_000_000)
print(f"NumPy random耗时: {time.time() - start_time:.4f}秒")从我的经验来看,当数据量达到百万级别以上时,NumPy的性能优势就会非常明显。
随机数生成器的选择:
random
random
内存使用:
random.shuffle()
总的来说,理解
random
以上就是Python如何生成随机数_Python随机数生成方法详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号