​ 随机种子(Random Seed)是计算机科学和统计学中用于生成伪随机数的一个起始点。理解随机种子的工作原理,首先要明白“伪随机数”的概念。

​ 计算机本身无法生成真正的随机数,因为它们是确定性的机器,执行相同的指令总是会产生相同的结果。因此,所谓的“随机数”实际上是由算法生成的、看起来像是随机分布的一系列数字,这些数字被称为伪随机数。

​ 随机种子是一个初始值,它被提供给一个伪随机数生成器(PRNG, Pseudo-Random Number Generator),以开始生成一系列伪随机数。给定相同的种子,PRNG将会产生完全相同的序列的伪随机数。这是因为PRNG使用的是确定性的算法:对于给定的输入(即种子),它总是会输出同样的数字序列。

工作原理

  1. 选择种子:可以使用系统时间、键盘输入事件的时间间隔或其他不可预测的数据作为种子。也可以手动指定一个种子值,这对于需要重现实验结果或调试程序非常有用。
  2. 生成伪随机数:一旦选择了种子,PRNG就开始工作,基于这个种子按照特定算法生成一串伪随机数。算法的设计保证了生成的数列具有良好的统计特性,比如均匀分布等。
  3. 重复性和可预测性:如果知道了种子和使用的算法,那么就可以准确地预测出整个伪随机数序列。这也是为什么在进行科学研究、软件测试或加密时,有时需要特别注意随机种子的选择,以确保结果的不可预测性和安全性。

应用场景

  • 模拟和建模:为了确保模拟过程的可重复性,研究人员可能会使用固定的随机种子。
  • 游戏开发:在游戏中,随机种子可用于生成地图或事件,同时允许玩家通过记住种子来重现特定的游戏体验。
  • 加密技术:虽然简单的PRNG不适合直接用于加密目的,但某些高级加密安全伪随机数生成器(CSPRNGs)依赖于类似的概念,不过它们需要更高的安全标准。

​ 总之,随机种子为伪随机数生成提供了起点,其重要性在于既能够创建看似随机的数据序列,又能根据需要重现这些序列。

​ 考虑以下情况:

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

seed = 42
np.random.seed(seed)
data1 = np.random.rand(5)

np.random.seed(seed) # 重新设置了种子
data2 = np.random.rand(5) # 由于重新设置了种子,data2将会和data1相同

print(data1)
print(data2)

​ 在这个例子中,data1data2 将会是相同的,因为你在生成 data2 前重新设置了种子。如果你不希望这样,只需在生成第一组数据前设置一次种子即可,如下所示:

1
2
3
4
5
6
7
8
9
10
11
import numpy as np

seed = 42
np.random.seed(seed)
data1 = np.random.rand(5)

# 不再重新设置种子
data2 = np.random.rand(5) # 继续从上次离开的地方生成随机数

print(data1)
print(data2)

​ 在这种情况下,data1data2 应该是不同的,但它们都是基于相同的初始种子生成的。也就是说,虽然两组数据不同,但给定相同的种子,其他任何人执行同样的操作也会得到完全一样的 data1data2,从而保证了结果的可重复性。