随机数与随机数种子
在计算机科学中,随机数种子(简称种子)是伪随机数生成器(PRNG)的初始值。伪随机数生成器并不是真正意义上的随机数生成器,而是通过一系列确定性的算法来生成一系列看起来是随机的数字。种子值决定了这个序列的起点,也就是说,给定相同的种子值,伪随机数生成器将会生成相同的序列。
种子的作用
初始化状态:
- 种子用于初始化伪随机数生成器的状态。每次启动伪随机数生成器时,都会根据种子值来设置其初始状态。
确保可重复性:
- 设置相同的种子值,可以确保每次生成的随机数序列相同。这对于科学研究、算法开发和软件测试等场合尤为重要,因为这样可以确保实验或测试结果的一致性和可重复性。
调试便利:
- 在调试程序时,如果使用固定的种子值,可以帮助开发者重现特定的问题场景,从而更容易地定位和修复错误。
为什么设置了种子值,数值就不会变?
当设置了种子值之后,伪随机数生成器的内部状态被初始化为一个已知的、固定的状态。从这个状态开始,生成器会按照预定的算法生成随机数序列。由于算法本身是确定性的,只要种子相同,生成的序列也一定相同。
假如算法为y = lnx + 2x;种子值就是给x赋值;所以输出的y值一定是定值。
既然是伪随机,为什么几乎每次结果都看起来是随机的?
当
seed = None
时,伪随机数生成器(PRNG)通常会使用一个非确定性的来源来初始化其状态。这个非确定性的来源通常是系统的时间戳或其他环境变量,比如进程ID、线程ID或者是硬件提供的随机性。因为这些来源随着时间和其他条件的变化而变化,所以每次运行程序时,PRNG 的初始状态都会不同,进而生成的随机数序列也会不同。为什么
seed = None
会产生不同的随机数?
系统时间:
- 如果没有显式地设置种子值,许多伪随机数生成器会使用系统当前的时间作为种子值的一部分。因为系统时间不断变化,所以每次程序运行时使用的种子值也会不同,从而导致生成的随机数序列不同。
环境变量:
- 除了系统时间之外,有些伪随机数生成器还会利用其他环境变量来初始化其状态。这些环境变量也可能随时间和运行环境的不同而变化,因此导致生成的随机数序列不同。
示例:
import numpy as np # 不指定随机种子的情况 np.random.seed(None) print("第一次随机数:", np.random.rand(5)) np.random.seed(None) print("第二次随机数:", np.random.rand(5)) # 指定随机种子的情况 np.random.seed(42) print("第一次随机数(种子为42):", np.random.rand(5)) np.random.seed(42) print("第二次随机数(种子为42):", np.random.rand(5)) np.random.seed(13) print("第三次随机数(种子为13):", np.random.rand(5)) np.random.seed(13) print("第三次随机数(种子为13):", np.random.rand(5))
结果:
第一次随机数: [0.86992753 0.67600782 0.06811269 0.22725053 0.16067545]
第二次随机数: [0.30769898 0.90467254 0.44883338 0.070852 0.7840202 ]
第一次随机数(种子为42): [0.37454012 0.95071431 0.73199394 0.59865848 0.15601864]
第二次随机数(种子为42): [0.37454012 0.95071431 0.73199394 0.59865848 0.15601864]
第三次随机数(种子为13): [0.77770241 0.23754122 0.82427853 0.9657492 0.97260111]
第三次随机数(种子为13): [0.77770241 0.23754122 0.82427853 0.9657492 0.97260111]
注:种子为13和种子为42的结果一定是这个。
随机数种子有什么作用?
随机数种子(Random Seed)在计算机科学中主要用于初始化伪随机数生成器(PRNG)。它的主要作用包括但不限于以下几点:
初始化状态:
- 随机数种子用于初始化伪随机数生成器的内部状态。每一次调用伪随机数生成器之前,都需要通过种子值来设置其初始状态。这个状态决定了随后生成的随机数序列。
确保可重复性:
- 设置相同的随机数种子可以确保每次生成的随机数序列相同。这对于科研实验、算法开发、软件测试等场合尤为重要,因为这样可以确保实验或测试结果的一致性和可重复性。
调试便利:
- 在调试程序时,如果使用固定的种子值,可以帮助开发者重现特定的问题场景,从而更容易地定位和修复错误。
算法测试:
- 在测试算法时,使用固定的随机数种子可以确保每次测试都是在相同的初始条件下进行,这样可以更公平地比较不同算法的表现。
仿真与建模:
- 在进行仿真或建模时,使用随机数种子可以确保每次运行仿真或模型时产生的随机事件是相同的,这对于验证模型的行为和结果非常有用。
因此,如果想要复现结果一致,最好设置一个随机数种子。