如何在Python中生成随机数
随机性的使用是机器学习算法配置和评估的重要组成部分。
从人工神经网络中权重的随机初始化,到将数据分割成随机训练集和测试集,再到随机梯度下降中训练数据集的随机洗牌,生成随机数并利用随机性是必需的技能。
在本教程中,你将了解如何在Python中生成和使用随机数。
完成本教程后,你将了解:
- 这种随机性可以通过使用伪随机数生成器应用到程序中。
- 如何通过Python标准库生成随机数并使用随机性。
- 如何通过NumPy库生成随机数组。
我们开始吧。
教程概述
本教程分为3个部分,它们是:
- 伪随机数发生器。
- 使用Python实现随机数。
- 具有NumPy的随机数。
1.伪随机数发生器
我们注入程序和算法的随机性来源是一种称为伪随机数生成器的数学技巧。
随机数生成器是从真正的随机性来源生成随机数的系统。通常是一些物理的东西,比如盖革计数器,结果会变成随机数。在机器学习中,我们不需要真正的随机性。相反,我们可以使用伪随机性。伪随机性是看起来接近随机的数字样本,但它是使用确定性过程生成的。
使用伪随机数生成器对数据进行混洗并使用随机值初始化系数。这些小程序通常是你可以调用的函数,它将返回一个随机数。再次调用时,它们将返回一个新的随机数。包装器函数通常也是可用的,允许你以整数、浮点、特定分布、特定范围等形式获得随机性。
这些数字是按顺序生成的。该序列是确定性的,并且以初始数字作为种子。如果你没有显式设定伪随机数生成器的种子,则它可能使用以秒或毫秒为单位的当前系统时间作为种子。
种子的价值并不重要。你想选什么就选什么。重要的是,过程的相同种子将产生相同的随机数序列。
让我们用一些例子来具体说明这一点。
2.使用Python实现随机数。
Python标准库提供了一个名为Random的模块,该模块提供了一套用于生成随机数的函数。
Python使用一种流行且健壮的伪随机数生成器,称为Mersenne Twister。
在本节中,我们将查看一些使用标准Python API生成和使用随机数和随机性的用例。
为随机数生成器设定种子
伪随机数生成器是生成近乎随机数序列的数学函数。
它接受一个称为种子的参数来启动序列。该函数是确定性的,这意味着给定相同的种子,它每次都会产生相同的数字序列。种子的选择并不重要。
SEED()函数将作为伪随机数生成器的种子,以整数值作为参数,例如1或7。如果在使用随机性之前没有调用SEED()函数,则默认使用从纪元(1970)开始的当前系统时间(以毫秒为单位)。
下面的示例演示了对伪随机数生成器进行种子设定、生成一些随机数,并显示了对生成器重新设定种子将导致生成相同的数字序列。
# seed the pseudorandom number generator from random import seed from random import random # seed random number generator seed(1) # generate some random numbers print(random(), random(), random()) # reset the seed seed(1) # generate some random numbers print(random(), random(), random())
运行示例,用值1设定伪随机数生成器的种子,生成3个随机数,重新设定生成器的种子,并显示生成了相同的3个随机数。
0.13436424411240122 0.8474337369372327 0.763774618976614 0.13436424411240122 0.8474337369372327 0.763774618976614
可以通过设置种子来控制随机性,以确保代码每次都产生相同的结果,例如在生产模型中。
对于使用随机化来控制混杂变量的运行实验,可以为每个实验运行使用不同的种子。
随机浮点值
可以使用Random()函数生成随机浮点值。将生成介于0和1之间的值,特别是在间隔[0,1]内。
值是从均匀分布中抽取的,这意味着每个值都有相等的机会被抽取。
下面的示例生成10个随机浮点值。
# generate random floating point values from random import seed from random import random # seed random number generator seed(1) # generate random numbers between 0-1 for _ in range(10): value = random() print(value)
运行该示例将生成并打印每个随机浮点值。
0.13436424411240122 0.8474337369372327 0.763774618976614 0.2550690257394217 0.49543508709194095 0.4494910647887381 0.651592972722763 0.7887233511355132 0.0938595867742349 0.02834747652200631
通过将浮点值乘以新范围的大小并添加最小值,可以将浮点值重新缩放到所需的范围,如下所示:
scaled value = min + (value * (max - min))
其中,min和max分别是所需范围的最小值和最大值,value是在0和1之间的范围内随机生成的浮点值。
随机整数值
可以使用randint()函数生成随机整数值。
此函数接受两个参数:生成的整数值的范围的开始和结束。随机整数在范围值的起始值和结束值内生成,特别是在区间[开始,结束]内生成。随机值是从均匀分布中抽取的。
下面的示例生成10个介于0和10之间的随机整数值。
# generate random integer values from random import seed from random import randint # seed random number generator seed(1) # generate some integers for _ in range(10): value = randint(0, 10) print(value)
运行该示例将生成并打印10个随机整数值。
2 9 1 4 1 7 7 7 10 6
随机高斯值
可以使用Gauss()函数从高斯分布中提取随机浮点值。
此函数接受两个参数,这两个参数与控制分布大小的参数相对应,特别是平均值和标准差。
下面的示例从均值为0.0、标准差为1.0的高斯分布中生成10个随机值。
请注意,这些参数不是值的界限,值的扩散将由分布的钟形控制,在这种情况下,按比例可能高于和低于0.0。
# generate random Gaussian values from random import seed from random import gauss # seed random number generator seed(1) # generate some Gaussian values for _ in range(10): value = gauss(0, 1) print(value)
运行该示例将生成并打印10个高斯随机值。
1.2881847531554629 1.449445608699771 0.06633580893826191 -0.7645436509716318 -1.0921732151041414 0.03133451683171687 -1.022103170010873 -1.4368294451025299 0.19931197648375384 0.13337460465860485
从列表中随机选择
随机数可用于从列表中随机选择一项。
例如,如果一个列表有10个项目,索引在0到9之间,那么你可以生成一个介于0和9之间的随机整数,并使用它从列表中随机选择一个项目。CHOICE()函数为你实现此行为。选择是以一致的可能性进行的。
下面的示例生成了一个包含20个整数的列表,并给出了从该列表中选择一个随机项的五个示例。
# choose a random element from a list from random import seed from random import choice # seed random number generator seed(1) # prepare a sequence sequence = [i for i in range(20)] print(sequence) # make choices from the sequence for _ in range(5): selection = choice(sequence) print(selection)
运行该示例首先打印整数值列表,然后是从列表中选择和打印随机值的五个示例。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] 4 18 2 8 3
列表中的随机子样本
我们可能对重复从列表中随机选择项目以创建随机选择的子集感兴趣。
重要的是,一旦从列表中选择项目并将其添加到子集,则不应再次添加该项目。这称为选择而不替换,因为一旦为子集选择了列表中的项目,就不会将其添加回原始列表(即不能重新选择)。
此行为在sample()函数中提供,该函数从列表中选择一个随机样本,而不进行替换。该函数将子集的列表和大小作为参数进行选择。请注意,项目实际上不会从原始列表中删除,而只是选择到列表的副本中。
下面的示例演示如何从20个整数的列表中选择5个项目的子集。
# select a random sample without replacement from random import seed from random import sample # seed random number generator seed(1) # prepare a sequence sequence = [i for i in range(20)] print(sequence) # select a subset without replacement subset = sample(sequence, 5) print(subset)
运行该示例首先打印整数值列表,然后选择并打印随机样本以进行比较。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] [4, 18, 2, 8, 3]
随机洗牌名单
随机性可以用来洗牌,比如洗一副牌。
函数的作用是:对列表进行混洗。置乱就地执行,这意味着作为参数提供给shuffle()函数的列表是置乱的,而不是生成并返回的列表的置乱副本。
下面的示例演示了对整数值列表进行随机置乱。
# randomly shuffle a sequence from random import seed from random import shuffle # seed random number generator seed(1) # prepare a sequence sequence = [i for i in range(20)] print(sequence) # randomly shuffle the sequence shuffle(sequence) print(sequence)
运行该示例首先打印整数列表,然后在随机洗牌后打印相同的列表。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] [11, 5, 17, 19, 9, 0, 16, 1, 15, 6, 10, 13, 14, 12, 7, 3, 8, 2, 18, 4]
3.带NumPy的随机数
在机器学习中,你可能会使用scikit-learn和Keras等库。
这些库在幕后利用了NumPy,这是一个非常有效地处理向量和数字矩阵的库。
NumPy也有自己的伪随机数生成器实现和方便的包装器函数。
NumPy还实现了Mersenne Twister伪随机数生成器。
让我们看几个生成随机数并对NumPy数组使用随机性的示例。
为随机数生成器设定种子
NumPy伪随机数生成器不同于Python标准库伪随机数生成器。
重要的是,设定Python伪随机数生成器的种子不会影响NumPy伪随机数生成器。它必须是种子,必须单独使用。
函数的作用是:接受一个整数作为种子值,为NumPy伪随机数生成器设定种子。
下面的示例演示了如何为生成器设定种子,以及重新设定生成器的种子将如何导致生成相同的随机数序列。
# seed the pseudorandom number generator from numpy.random import seed from numpy.random import rand # seed random number generator seed(1) # generate some random numbers print(rand(3)) # reset the seed seed(1) # generate some random numbers print(rand(3))
运行示例对伪随机数生成器进行种子设定,打印一个随机数序列,然后对生成器重新设定种子,显示生成的随机数序列完全相同。
[4.17022005e-01 7.20324493e-01 1.14374817e-04] [4.17022005e-01 7.20324493e-01 1.14374817e-04]
随机浮点值数组
可以使用rand()NumPy函数生成随机浮点值的数组。
如果未提供参数,则创建单个随机值,否则可以指定数组的大小。
下面的示例创建从均匀分布中提取的10个随机浮点值的数组。
# generate random floating point values from numpy.random import seed from numpy.random import rand # seed random number generator seed(1) # generate random numbers between 0-1 values = rand(10) print(values)
运行该示例将生成并打印随机浮点值的NumPy数组。
[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01 1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01 3.96767474e-01 5.38816734e-01]
随机整数值数组
可以使用randint()NumPy函数生成随机整数数组。
此函数接受三个参数:范围的下端、范围的上端和要生成的整数值的数量或数组的大小。随机整数将从包括下值和不包括上值的均匀分布中提取,例如在区间[下,上)中。
下面的示例演示了如何生成随机整数数组。
# generate random integer values from numpy.random import seed from numpy.random import randint # seed random number generator seed(1) # generate some integers values = randint(0, 10, 20) print(values)
运行该示例将生成并打印一个由20个介于0和10之间的随机整数值组成的数组。
[5 8 9 5 0 0 1 7 6 9 2 4 5 2 4 2 4 7 7 9]
随机高斯值数组
可以使用randn()NumPy函数生成随机高斯值的数组。
此函数接受单个参数来指定结果数组的大小。高斯值取自标准高斯分布;这是一个平均值为0.0,标准偏差为1.0的分布。
下面的示例显示如何生成随机高斯值的数组。
# generate random Gaussian values from numpy.random import seed from numpy.random import randn # seed random number generator seed(1) # generate some Gaussian values values = randn(10) print(values)
运行该示例将从标准高斯分布生成并打印一个由10个随机值组成的数组。
[ 1.62434536 -0.61175641 -0.52817175 -1.07296862 0.86540763 -2.3015387 1.74481176 -0.7612069 0.3190391 -0.24937038]
标准高斯分布的值可以通过将该值乘以标准偏差并将所需缩放分布的平均值相加来缩放。例如:
scaled value = mean + value * stdev
其中,均值和stdev是期望的缩放高斯分布的平均值和标准偏差,值是从标准高斯分布随机生成的值。
无序排列NumPy数组
可以使用Shuffle()NumPy函数对NumPy数组进行随机就地混洗。
下面的示例演示了如何混洗NumPy数组。
# randomly shuffle a sequence from numpy.random import seed from numpy.random import shuffle # seed random number generator seed(1) # prepare a sequence sequence = [i for i in range(20)] print(sequence) # randomly shuffle the sequence shuffle(sequence) print(sequence)
运行该示例首先生成一个包含20个整数值的列表,然后无序排列并打印无序排列的数组。
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19] [3, 16, 6, 10, 2, 14, 4, 17, 7, 1, 13, 0, 19, 18, 9, 15, 8, 12, 11, 5]
进一步阅读
如果你想深入了解,本节提供了更多关于该主题的资源。
摘要
在本教程中,你了解了如何在Python中生成和使用随机数。
具体地说,你了解到:
- 这种随机性可以通过使用伪随机数生成器应用到程序中。
- 如何通过Python标准库生成随机数并使用随机性。
- 如何通过NumPy库生成随机数组。