7.1 随机数生成器的概念 第七章:NumPy 随机数生成 ( 模块) 7.1 随机数生成器的概念 在科学计算、模拟、机器学习和数据分析等领域,随机数扮演着至关重要的角色。NumPy 提供了强大的随机数生成功能,通过 模块实现。理解随机数生成器的概念是有效使用这些功能的基础。 7.1.1 伪随机数 计算机生成的随机数实际上是伪随机数。这意味着它们不是真正意义上的随机,而是通过确定性的算法产生的。这些算法从一个初始值(称为种子)开始,通过一系列数学运算生成看起来随机的数字序列。 伪随机数生成器 (PRNG) 的优点是: 可重复性: 给定相同的种子,PRNG 将始终生成相同的数字序列。这对于调试和复现实验结果至关重要。 效率: PRNG 的计算速度通常很快,可以高效地生成大量的随机数。 7.1.
np.random 模块)在科学计算、模拟、机器学习和数据分析等领域,随机数扮演着至关重要的角色。NumPy 提供了强大的随机数生成功能,通过 np.random 模块实现。理解随机数生成器的概念是有效使用这些功能的基础。
计算机生成的随机数实际上是伪随机数。这意味着它们不是真正意义上的随机,而是通过确定性的算法产生的。这些算法从一个初始值(称为种子)开始,通过一系列数学运算生成看起来随机的数字序列。
伪随机数生成器 (PRNG) 的优点是:
可重复性: 给定相同的种子,PRNG 将始终生成相同的数字序列。这对于调试和复现实验结果至关重要。
效率: PRNG 的计算速度通常很快,可以高效地生成大量的随机数。
NumPy 提供了多种随机数生成器,每种生成器都有其自身的特点和适用场景。NumPy 1.17 版本引入了新的随机数生成器系统,基于 Generator 类。老的 RandomState 仍然可用,但推荐使用新的 Generator。
numpy.random.Generator: 这是推荐的随机数生成器。它使用更现代的算法,例如 PCG64,提供了更好的统计特性和性能。
numpy.random.RandomState: 这是较旧的随机数生成器。虽然仍然可用,但建议迁移到 Generator。
种子是 PRNG 的初始值。通过设置种子,可以确保每次运行程序时生成相同的随机数序列。这在需要可重复性的情况下非常有用。
Generator 生成随机数以下是使用 Generator 生成随机数的示例:
import numpy as np # 创建一个 Generator 实例,使用默认的 PCG64 算法 rng = np.random.default_rng() # 生成一个 0 到 1 之间的随机数 random_number = rng.random() print(f"Random number: {random_number}") # 生成一个包含 5 个 0 到 1 之间的随机数的数组 random_array = rng.random(5) print(f"Random array: {random_array}") # 生成一个 3x3 的 0 到 1 之间的随机数矩阵 random_matrix = rng.random((3, 3)) print(f"Random matrix:\n{random_matrix}") # 设置种子 rng = np.random.default_rng(seed=42) random_number_seeded = rng.random() print(f"Seeded random number: {random_number_seeded}") rng = np.random.default_rng(seed=42) random_number_seeded_again = rng.random() print(f"Seeded random number again: {random_number_seeded_again}")
代码解释:
rng = np.random.default_rng(): 创建一个 Generator 实例。default_rng() 返回一个新的 Generator 实例,使用默认的 PCG64 算法。
rng.random(): 生成一个 0 到 1 之间的均匀分布的随机数。
rng.random(5): 生成一个包含 5 个 0 到 1 之间的随机数的 NumPy 数组。
rng.random((3, 3)): 生成一个 3x3 的随机数矩阵。
rng = np.random.default_rng(seed=42): 创建一个 Generator 实例,并设置种子为 42。
连续两次使用相同的种子,生成相同的随机数。
RandomState 生成随机数虽然推荐使用 Generator,但了解 RandomState 仍然很重要,因为你可能会在旧代码中遇到它。
import numpy as np # 创建一个 RandomState 实例 rs = np.random.RandomState() # 生成一个 0 到 1 之间的随机数 random_number = rs.rand() print(f"Random number: {random_number}") # 生成一个包含 5 个 0 到 1 之间的随机数的数组 random_array = rs.rand(5) print(f"Random array: {random_array}") # 生成一个 3x3 的 0 到 1 之间的随机数矩阵 random_matrix = rs.rand(3, 3) print(f"Random matrix:\n{random_matrix}") # 设置种子 rs = np.random.RandomState(seed=42) random_number_seeded = rs.rand() print(f"Seeded random number: {random_number_seeded}") rs = np.random.RandomState(seed=42) random_number_seeded_again = rs.rand() print(f"Seeded random number again: {random_number_seeded_again}")
代码解释:
rs = np.random.RandomState(): 创建一个 RandomState 实例。
rs.rand(): 生成一个 0 到 1 之间的均匀分布的随机数。
rs.rand(5): 生成一个包含 5 个 0 到 1 之间的随机数的 NumPy 数组。
rs.rand(3, 3): 生成一个 3x3 的随机数矩阵。
rs = np.random.RandomState(seed=42): 创建一个 RandomState 实例,并设置种子为 42。
连续两次使用相同的种子,生成相同的随机数。
对于新的项目,强烈建议使用 Generator。
如果需要与旧代码兼容,可以使用 RandomState。
如果需要更高的统计质量,可以考虑使用不同的 Generator 算法,例如 MT19937。
随机数生成器维护一个内部状态,该状态决定了下一个生成的随机数。这意味着,每次调用生成器时,其状态都会更新。
随机数生成器在许多领域都有广泛的应用,包括:
模拟: 模拟物理系统、金融市场等。
机器学习: 初始化模型参数、分割数据集、随机森林等。
统计: 蒙特卡罗方法、bootstrap 抽样等。
游戏开发: 生成随机事件、控制 NPC 行为等。
以下是一个使用 Mermaid 绘制的图表,展示了随机数生成器的概念:
图表解释:
种子 (Seed): 随机数生成器的起始值。
随机数生成器 (PRNG): 使用种子和算法生成随机数的引擎。
内部状态: 随机数生成器内部维护的状态,影响后续生成的随机数。
随机数: 生成的伪随机数。
应用: 随机数在各种领域中的应用。
理解 NumPy 随机数生成器的概念对于有效使用 np.random 模块至关重要。通过选择合适的生成器、设置种子并了解其内部状态,可以生成高质量的随机数,并将其应用于各种科学计算和数据分析任务中。 建议使用新的 Generator 类,因为它提供了更好的性能和统计特性。 通过设置种子,可以实现可重复的随机数序列,这对于调试和复现实验结果非常重要。