Numpy 中的两种随机数生成方式:Generator 与 RandomState有何不同
在本文中,我们将介绍:
阅读更多:Numpy 教程
什么是随机数生成器?
在计算机科学中,随机数生成器(Random Number Generator)是一个用来生成随机数的算法或设备。随机数生成器能够用来模拟一些过程,如赌博、游戏等。同时,随机数生成也是密码学的重要组成部分。
计算机程序可以通过直接运算、查表法、以及蒙特卡洛方法等进行概率模拟,但当需要随机事件发生时,需要使用随机数。
Numpy 中的随机数生成方式
Numpy 是 Python 中用于科学计算的重要库之一。在 Numpy 中,有两种获取随机数的方式:使用 numpy.random.Generator 或 numpy.random.RandomState,下面我们将详细介绍这两种方法的区别。
numpy.random.Generator
numpy.random.Generator 是在 Numpy 1.17 版本中引入的全新随机数生成器,它基于 BitGenerator 实例,包含了更多的随机数生成方法,并且具有更好的可重复性、更好的统计特性。
在 Numpy 1.17 版本中,生成随机数的方式可以这样实现:
import numpy as np
rng = np.random.default_rng()
data = rng.random(10)
首先,我们引入了 numpy 库,并使用 np.random.default_rng() 方法获取 Generator 实例 rng。然后,我们使用 rng.random(10) 方法生成了一个包含十个随机数的一维数组。
当然,我们也可以使用其他随机数生成方法,例如:
rng.integers(0, 10, size=10)
这里使用 rng.integers 方法生成一个范围在 0 到 10 之间的长度为 10 的整数数组。
需要注意的是,如果我们对同样的随机数生成器实例进行设定,那么每次运行程序都将得到相同的结果。这样的好处在于我们方便地进行调试,并且能够保证程序的可重复性。
下面的代码演示了在两次运行中输出随机数的一致性:
import numpy as np
rng = np.random.default_rng(42)
print(rng.random())
rng = np.random.default_rng(42)
print(rng.random())
运行结果:
0.7739560507925225
0.7739560507925225
可以看到,由于我们对同一个随机数生成器实例进行了设定,所以两次运行的结果是一样的。
numpy.random.RandomState
在 Numpy 1.16 版本及之前,我们主要使用 numpy.random.RandomState 类来生成随机数。
import numpy as np
rng = np.random.RandomState(42)
data = rng.random_sample(10)
我们可以看到,这里和 numpy.random.Generator 不同的是我们使用的是 numpy.random.RandomState 类。其他的用法与 Generator 相同。
同样地,我们可以使用相关的随机数生成方法,例如:
rng.randint(0, 10, size=10)
这里使用 rng.randint 方法生成一个长度为 10 且在 0 到 10 之间的整数数组。
需要注意的是,当使用 RandomState 时,如果我们对同一个随机数生成器实例进行设定,那么每次运行程序得到的结果也都将是一样的。
下面的代码表示了在两次运行中输出随机数的一致性:
import numpy as np
rng = np.random.RandomState(42)
print(rng.random())
rng = np.random.RandomState(42)
print(rng.random())
运行结果:
0.6394267984578837
0.6394267984578837
同样地,由于我们对同一个随机数生成器实例进行了设定,所以两次运行的结果也是一样的。
numpy.random.Generator 与 RandomState 的区别
从 Numpy 1.17 版本开始,我们引入了全新的随机数生成器 numpy.random.Generator,并在之后的版本中推荐使用该方式生成随机数。在此之前,我们主要使用 numpy.random.RandomState 来生成随机数。
那么,numpy.random.Generator 与 numpy.random.RandomState 之间有何不同呢?
可复现性
在生成随机数时,很重要的一点就是可重复性。在同样的随机数生成器实例设定下,numpy.random.Generator 能够提供更好的可重复性。
在 Numpy 1.16 版本及之前,我们使用 RandomState 类时,需要在设定随机数种子的同时,使用 .rand() 或其他随机数生成方法生成一些随机数,以便随机数生成器开始工作。但这种方法不能保证稳定生成一个唯一的随机数流,可能在未来的版本中不再适用。
相比之下,numpy.random.Generator 提供了 .bit_generator 属性来跟踪它所使用的 BitGenerator。这个值保证是唯一的,同时能够轻松恢复随机数生成器的状态。
在 Numpy 1.17 版本之后,在初始化生成随机数生成器时,我们不必再担心随机数初始化的问题。同时,numpy.random.Generator 提供了函数来恢复随机数生成序列的任意状态以及保存这个状态。
生成的随机数序列
在 Numpy 1.17 版本之前,我们使用随机数生成器 numpy.random.RandomState 的功能来生成随机数序列。这个序列是通过设定一定的随机数种子,随机地选取随机数序列的值,后面每个值都是根据选取的值以及序列对数进行计算而得到的。
相比之下,numpy.random.Generator 所使用的 BitGenerator 是最小熵生成器(minimal entropy generator),生成的随机数流是与位生成器的状态相对应的。
在 Numpy 1.17 版本中,我们可以使用 Generator.permutation 方法来生成任意长度的随机置换。同时,numpy.random.Generator 在使用 numpy.random.RandomState 的所有随机数生成方法上都实现了一套版本,且表现出更好的统计学特性。
值得注意的是,numpy.random.RandomState 生成的随机数序列在一些测试中表现得不是很好。例如,它在 Dieharder 测试程序中的测试结果较差。而生成器,如 Mersenne Twister 等早期中使用的生成器,在测试中表现较好。
总结
在本篇文章中,我们介绍了 Python 的 Numpy 库中的两种随机数生成方式:numpy.random.Generator 和 numpy.random.RandomState,讲解了它们之间的区别。
总的来说,numpy.random.Generator 是在 Numpy 1.17 版本中引入的全新随机数生成器,具有更好的可重复性、更好的统计特性,是更好的选择,而 numpy.random.RandomState 则是在 Numpy 1.16 及更早版本中经常使用的随机数生成器方法。无论如何,无论您选择哪种方法,都应该确保您使用的是可重复的随机数生成器,并且对于编写的代码有机会测试您所选择的随机数生成器是否产生了真正的随机性。
极客教程