在计算科学中,随机种子是生成的伪随机数序列的起点。
这些数字看似随机,但它们遵循确定性序列。种子决定了该序列的初始状态。
在 Python 中NumPy 库,您可以使用设置随机种子numpy.random.seed()
功能。这将使随机数生成的输出可预测且可再现。
伪随机数与真随机数
随机数大致可分为两类:伪随机数和真随机数。
伪随机数
伪随机数是使用确定性算法生成的。给定相同的初始种子,它们每次都会产生相同的数字序列。
伪随机数的生成效率很高,适合大多数应用,包括模拟和统计采样。
真随机数
真正的随机数是从根本上随机的物理过程生成的。
它们是不可预测的,也不遵循算法。真正的随机数通常用于不可预测性至关重要的加密应用中。
在 Python 中,可以使用专用硬件或在线服务获得真正的随机数,但它们超出了本教程的范围。
如何在 NumPy 中设置随机种子?
您使用numpy.random.seed()
函数并提供一个将用作种子的整数。
这是一个例子:
import numpy as np
np.random.seed(5)
print(np.random.rand())
Output:
0.22199317108973948
在此代码中,随机种子设置为 5。每次运行此代码时,生成的随机浮点将是相同的。
您可以将种子更改为任何整数以生成不同的随机数序列,但特定种子对应的序列将始终相同。
为什么使用随机种子?
使用随机数时,一致性和可重复性至关重要,尤其是在科学计算、模拟或机器学习任务中。
通过使用随机种子,您可以确保每次运行代码时生成的随机数都是相同的。
这是一个简单的演示:
无需播种:
import numpy as np
random_numbers_without_seed = [np.random.rand() for _ in range(5)]
print(random_numbers_without_seed)
Output:
[0.9507143064099162, 0.7319939418114051, 0.5986584841970366, 0.15601864044243652, 0.15599452033620265]
与播种:
np.random.seed(42)
random_numbers_with_seed = [np.random.rand() for _ in range(5)]
print(random_numbers_with_seed)
Output:
[0.3745401188473625, 0.9507143064099162, 0.7319939418114051, 0.5986584841970366, 0.15601864044243652]
在第一个代码片段中,如果没有设置种子,每次运行代码时随机数都会不同。
在第二个片段中,我们将种子设置为 42,每次运行时数字都将相同。
这允许以其他人可以精确复制的方式测试、验证和共享您的代码。
如何设置全局随机种子?
在 NumPy 中设置全局随机种子会影响库中的所有随机数生成函数。它是使涉及随机过程的代码可重现的重要工具。
这是一个例子:
import numpy as np
np.random.seed(42)
print(np.random.rand())
print(np.random.randint(10, 20))
Output:
0.3745401188473625
17
通过将种子设置为 42,每次代码运行时生成的随机浮点数和随机整数都将相同。
这演示了设置全局种子如何影响 NumPy 中的所有随机函数。
受影响的功能示例
NumPy 中的全局随机种子会影响生成随机数或执行随机操作的各种函数。
以下是其中一些函数的示例。
rand
生成 0 到 1 之间的随机浮点数:
import numpy as np
np.random.seed(0)
print(np.random.rand(3))
Output:
[0.5488135 0.71518937 0.60276338]
randint
生成指定范围内的随机整数:
np.random.seed(0)
print(np.random.randint(1, 10, 3))
Output:
[6 1 4]
shuffle
随机打乱数组的元素:
np.random.seed(0)
arr = [1, 2, 3, 4, 5]
np.random.shuffle(arr)
print(arr)
Output:
[3, 1, 2, 4, 5]
这些函数中的每一个都受到全局种子的影响,并且设置种子可确保结果在代码的不同运行中保持一致。
播种的最佳实践
在代码的早期设置种子
在代码或需要可重现随机数的函数的开头设置种子。这可确保序列正确初始化。
选择任意种子值与确定性种子
任意种子值都会产生特定的随机数序列。
也可以使用确定性种子,例如使用当前日期,但它们不能确保不同运行或机器之间的可重复性。
管理种子以实现代码执行的可重复性
记录代码中使用的种子值非常重要,以确保其他人可以重现准确的结果。
这是显示最佳实践的代码片段:
import numpy as np
# Set the seed early
seed_value = 42
np.random.seed(seed_value)
random_numbers = np.random.rand(3)
print(f"Seed: {seed_value}")
print(f"Random Numbers: {random_numbers}")
Output:
Seed: 42
Random Numbers: [0.37454012 0.95071431 0.73199394]
这些实践确保您的代码的随机过程对于您和可能使用您的代码的其他人来说都是透明的、受控的和可重现的。
实施具有可重现结果的模拟
在实现需要随机数生成的模拟时,重现结果通常至关重要。
使用固定种子是实现这一目标的关键。
下面是一个简单的蒙特卡罗模拟示例,用于估计 π 的值:
import numpy as np
np.random.seed(0)
num_points = 10000
inside_circle = 0
for _ in range(num_points):
x, y = np.random.rand(2)
if x**2 + y**2 <= 1:
inside_circle += 1
estimated_pi = (inside_circle / num_points) * 4
print("Estimated π:", estimated_pi)
Output:
Estimated π: 3.1428
通过在模拟开始时设置种子,您可以确保每次运行结果都是一致的。
这使您可以比较更改,验证您的模拟,并充满信心地分享它,以便其他人获得相同的结果。
资源
https://numpy.org/doc/stable/reference/random/ generated/numpy.random.seed.html