前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在Python和numpy中生成随机数

如何在Python和numpy中生成随机数

作者头像
AiTechYun
发布2018-07-27 14:18:08
19.2K0
发布2018-07-27 14:18:08
举报
文章被收录于专栏:ATYUN订阅号ATYUN订阅号

AiTechYun

编辑:yxy

随机性的使用是机器学习算法配置和评估的重要部分。从神经网络中的权重的随机初始化,到将数据分成随机的训练和测试集,再到随机梯度下降中的训练数据集的随机混洗(random shuffling),生成随机数和利用随机性是必需掌握的技能。

在本教程中,你将了解如何在Python中生成和使用随机数。

完成本教程后,你会学到:

  • 可以通过使用伪随机数生成器在程序中应用随机性。
  • 如何通过Python标准库生成随机数和使用随机性。
  • 如何通过NumPy库生成随机数组。

让我们开始吧。

教程概述

本教程分为3个部分:

  1. 伪随机数生成器
  2. Python生成随机数
  3. NumPy生成随机数

1.伪随机数生成器

我们注入到程序和算法中的随机性来源于一种被称为伪随机数生成器的数学技巧。

随机数生成器是从真实的随机源生成随机数的系统。经常是物理的东西,比如盖革计数器,其结果会变成随机数。我们在机器学习中不需要真正的随机性。因此,我们可以使用伪随机性。伪随机性是看起来接近随机的数字样本,但是它是使用确定性的过程生成的。

使用伪随机数生成器可以混洗数据并用随机值初始化系数。这种小程序通常是一个可以调用的返回随机数的函数。如果再次调用,他们将返回一个新的随机数。包装函数通常也是可用的,允许你得到整数,浮点,特定分布,特定范围内的随机数等等。

数字按序列生成。序列是确定性的,并以初始数字播种(seed)。如果没有显式地为伪随机数生成器设定种子,那么它可以使用当前系统时间(以秒或毫秒为单位)作为种子。

种子的值无关紧要。你可以选择任何数。重要的是,相同播种过程将导致相同的随机数序列。

让我们通过一些具体的例子进行说明。

2.Python生成随机数

Python标准库有一个名为random的模块,它提供了一组用于生成随机数的函数。

Python使用一种流行且强大的伪随机数生成器,Mersenne Twister。

在本节中,我们将介绍使用标准Python API生成和使用随机数和随机性的一些用例。

播种随机数生成器

伪随机数生成器是一种生成几乎随机数序列的数学函数。

它需要一个参数来启动序列,称为种子。该函数是确定性的,意味着给定相同的种子,它每次都会产生相同的数字序列。种子的选择无关紧要。

seed()函数将播种伪随机数生成器,以整数值作为参数,如1或7.如果seed()函数之前没有使用随机性调用时,默认是使用当前系统时间中从时间起点(1970)开始的毫秒。

下面的示例演示了对伪随机数生成器进行播种,生成一些随机数,并显示重新播种生成器将导致生成相同的数字序列。

代码语言:javascript
复制
# seed the pseudorandom number generator
代码语言:javascript
复制
from randomimport seed
代码语言:javascript
复制
from randomimport random
代码语言:javascript
复制
# seed random number generator
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# generate some random numbers
代码语言:javascript
复制
print(random(), random(), random())
代码语言:javascript
复制
# reset the seed
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# generate some random numbers
代码语言:javascript
复制
print(random(), random(), random())

运行示例,伪随机数生成器的seed值为1,生成3个随机数,重新播种生成器,然后我们看到生成了相同的三个随机数。

代码语言:javascript
复制
0.13436424411240122 0.8474337369372327 0.763774618976614
代码语言:javascript
复制
0.13436424411240122 0.8474337369372327 0.763774618976614

通过设置种子以确保每次生成相同的结果(例如在生产模型中),可以有效地控制随机性。

对于运行实验,使用随机化来控制混杂变量,可以对每个实验运行使用不同的种子。

随机浮点值

可以使用random()函数生成随机浮点值。值将在0和1之间的范围内生成,具体来说是在区间[0,1)中。

值服从均匀分布(uniform distribution),意味着每个值都有相同的机会被选出。

以下是生成10个随机浮点值的示例。

代码语言:javascript
复制
# generate random floating point values
代码语言:javascript
复制
from randomimport seed
代码语言:javascript
复制
from randomimport random
代码语言:javascript
复制
# seed random number generator
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# generate random numbers between 0-1
代码语言:javascript
复制
for _in range(10):
代码语言:javascript
复制
    value= random()
代码语言:javascript
复制
    print(value)

运行该示例,生成并打印每个随机浮点值。

代码语言:javascript
复制
0.13436424411240122
代码语言:javascript
复制
0.8474337369372327
代码语言:javascript
复制
0.763774618976614
代码语言:javascript
复制
0.2550690257394217
代码语言:javascript
复制
0.49543508709194095
代码语言:javascript
复制
0.4494910647887381
代码语言:javascript
复制
0.651592972722763
代码语言:javascript
复制
0.7887233511355132
代码语言:javascript
复制
0.0938595867742349
代码语言:javascript
复制
0.02834747652200631

浮点值可以通过将它们乘以新范围的大小并加上最小值来重新调整到所需范围,如下所示:

代码语言:javascript
复制
scaled value= min + (value* (max - min))

其中min和max分别是所需范围的最小值和最大值,value是随机生成的浮点值,范围在0到1之间。

随机整数值

randint()函数可以生成随机整数值。

此函数有两个参数:生成的整数值的范围的开始和结束。生成的随机整数值的开始和结束范围内,包括范围值的开始和结束,即在区间[start,end]中。随机值从均匀分布抽取。

下面的示例生成10个0到10之间的随机整数值。

代码语言:javascript
复制
# generate random integer values
代码语言:javascript
复制
from randomimport seed
代码语言:javascript
复制
from randomimport randint
代码语言:javascript
复制
# seed random number generator
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# generate some integers
代码语言:javascript
复制
for _in range(10):
代码语言:javascript
复制
    value= randint(0,10)
代码语言:javascript
复制
    print(value)

运行该示例会生成并打印10个随机整数值。

代码语言:javascript
复制
2
代码语言:javascript
复制
9
代码语言:javascript
复制
1
代码语言:javascript
复制
4
代码语言:javascript
复制
1
代码语言:javascript
复制
7
代码语言:javascript
复制
7
代码语言:javascript
复制
7
代码语言:javascript
复制
10
代码语言:javascript
复制
6
随机高斯值

可以使用gauss()函数从高斯分布中抽取随机浮点值。

这个函数需要两个参数,这些参数对应于控制分布大小的参数,也就是平均值和标准差。

下面的示例生成10个从高斯分布抽取的随机值,平均值为0.0,标准差为1.0。

请注意,这些参数不是值的界限,并且值的扩展将由分布的钟形控制,在这种情况下,比例可能高于和低于0.0。

代码语言:javascript
复制
# generate random Gaussian values
代码语言:javascript
复制
from randomimport seed
代码语言:javascript
复制
from randomimport gauss
代码语言:javascript
复制
# seed random number generator
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# generate some Gaussian values
代码语言:javascript
复制
for _in range(10):
代码语言:javascript
复制
    value= gauss(0,1)
代码语言:javascript
复制
    print(value)

运行该示例会生成并打印10个高斯随机值。

代码语言:javascript
复制
1.2881847531554629
代码语言:javascript
复制
1.449445608699771
代码语言:javascript
复制
0.06633580893826191
代码语言:javascript
复制
-0.7645436509716318
代码语言:javascript
复制
-1.0921732151041414
代码语言:javascript
复制
0.03133451683171687
代码语言:javascript
复制
-1.022103170010873
代码语言:javascript
复制
-1.4368294451025299
代码语言:javascript
复制
0.19931197648375384
代码语言:javascript
复制
0.13337460465860485
从列表中随机选择

随机数可用于从列表中随机选择一个。

例如,如果列表有10个在0到9之间的项,那么可以生成0到9之间的随机整数,并使用它从列表中随机选择一项。该choice()函数可以实现此功能。选择是的可能性是一样的。

下面的示例生成一个包含20个整数的列表,并给出了从列表中选择一个随机项的示例(共选5次)。

代码语言:javascript
复制
# choose a random element from a list
代码语言:javascript
复制
from randomimport seed
代码语言:javascript
复制
from randomimport choice
代码语言:javascript
复制
# seed random number generator
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# prepare a sequence
代码语言:javascript
复制
sequence= [ifor iin range(20)]
代码语言:javascript
复制
print(sequence)
代码语言:javascript
复制
# make choices from the sequence
代码语言:javascript
复制
for _in range(5):
代码语言:javascript
复制
    selection= choice(sequence)
代码语言:javascript
复制
    print(selection)

首先运行该示例打印整数值列表,然后打印从列表中选择五个数。

代码语言:javascript
复制
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
代码语言:javascript
复制
4
代码语言:javascript
复制
18
代码语言:javascript
复制
2
代码语言:javascript
复制
8
代码语言:javascript
复制
3
列表中的随机子样本

我们可能会需要重复从列表中随机选择项以创建随机选择的子集。

重要的是,一旦从列表中选择了一个项目并将其添加到子集中,就不应再次添加它。这被称为无替换选择(selection without replacement),因为一旦为子集选择了列表中的项,它就不会被放回原始列表(即,不能重新选择)。

使用sample()函数可以完成此功能,这个函数从列表中选择随机样本而不进行替换。该函数需要的参数有列表和子集大小。请注意,这些选过的项实际上并未从原始列表中删除,只是被挑进了列表的副本。

下面的示例演示如何从20个整数的列表中选择五个项组成子集。

代码语言:javascript
复制
# select a random sample without replacement
代码语言:javascript
复制
from randomimport seed
代码语言:javascript
复制
from randomimport sample
代码语言:javascript
复制
# seed random number generator
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# prepare a sequence
代码语言:javascript
复制
sequence= [ifor iin range(20)]
代码语言:javascript
复制
print(sequence)
代码语言:javascript
复制
# select a subset without replacement
代码语言:javascript
复制
subset= sample(sequence,5)
代码语言:javascript
复制
print(subset)

运行示例打印整数值列表,然后打印选择的随机样本以进行比较。

代码语言:javascript
复制
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
代码语言:javascript
复制
[4,18,2,8,3]
随机混洗列表

随机性可用于随机混洗列表,就像洗牌。

可以使用shuffle()函数来洗牌一个列表。shuffle在适当的位置执行,这意味着被用作shuffle()函数的参数的列表被洗牌,而不是副本被洗牌。

下面的示例演示了随机混洗一个整数值列表。

代码语言:javascript
复制
# randomly shuffle a sequence
代码语言:javascript
复制
from randomimport seed
代码语言:javascript
复制
from randomimport shuffle
代码语言:javascript
复制
# seed random number generator
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# prepare a sequence
代码语言:javascript
复制
sequence= [ifor iin range(20)]
代码语言:javascript
复制
print(sequence)
代码语言:javascript
复制
# randomly shuffle the sequence
代码语言:javascript
复制
shuffle(sequence)
代码语言:javascript
复制
print(sequence)

运行该示例首先打印整数列表,然后打印经过随机混洗后的这个列表。

代码语言:javascript
复制
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
代码语言:javascript
复制
[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伪随机数生成器。它必须单独播种和使用。

seed()函数可以被用于播种的NumPy的伪随机数生成器,需要整数作为seed值。

下面的示例演示了如何为生成器设定seed以及如何重新播种生成器会导致生成相同的随机数序列。

代码语言:javascript
复制
# seed the pseudorandom number generator
代码语言:javascript
复制
from numpy.randomimport seed
代码语言:javascript
复制
from numpy.randomimport rand
代码语言:javascript
复制
# seed random number generator
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# generate some random numbers
代码语言:javascript
复制
print(rand(3))
代码语言:javascript
复制
# reset the seed
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# generate some random numbers
代码语言:javascript
复制
print(rand(3))

运行示例播种伪随机数生成器,打印随机数序列,然后重新播种生成器,显示生成完全相同的随机数序列。

代码语言:javascript
复制
[4.17022005e-01 7.20324493e-01 1.14374817e-04]
代码语言:javascript
复制
[4.17022005e-01 7.20324493e-01 1.14374817e-04]
随机浮点值数组

随机浮点值数组可以使用NumPy函数rand() 生成。

如果未提供参数,则创建单个随机值。当然,也可以指定数组的大小。

下面的示例创建一个服从均匀分布的10个随机浮点值的数组。

代码语言:javascript
复制
# generate random floating point values
代码语言:javascript
复制
from numpy.randomimport seed
代码语言:javascript
复制
from numpy.randomimport rand
代码语言:javascript
复制
# seed random number generator
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# generate random numbers between 0-1
代码语言:javascript
复制
values= rand(10)
代码语言:javascript
复制
print(values)

运行该示例生成并打印随机浮点值的NumPy数组。

代码语言:javascript
复制
[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01
代码语言:javascript
复制
 1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01
代码语言:javascript
复制
 3.96767474e-01 5.38816734e-01]
随机整数值数组

可以使用NumPy函数randint()生成随机整数数组。

此函数有三个参数,范围的下界,范围的上界,以及要生成的整数值的数量或数组的大小。随机整数将从均匀分布中抽取,包括下界的值,不包含上界的值,即在区间[lower,upper)中。

下面的示例演示了如何生成随机整数数组。

代码语言:javascript
复制
# generate random integer values
代码语言:javascript
复制
from numpy.randomimport seed
代码语言:javascript
复制
from numpy.randomimport randint
代码语言:javascript
复制
# seed random number generator
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# generate some integers
代码语言:javascript
复制
values= randint(0,10,20)
代码语言:javascript
复制
print(values)

运行该示例将生成并打印一个包含0到10之间的20个随机整数值的数组。

代码语言:javascript
复制
[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的分布。

下面的示例显示了如何生成随机高斯值数组。

代码语言:javascript
复制
# generate random Gaussian values
代码语言:javascript
复制
from numpy.randomimport seed
代码语言:javascript
复制
from numpy.randomimport randn
代码语言:javascript
复制
# seed random number generator
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# generate some Gaussian values
代码语言:javascript
复制
values= randn(10)
代码语言:javascript
复制
print(values)

运行该示例生成并打印来自标准高斯分布的10个随机值的数组。

代码语言:javascript
复制
[1.62434536 -0.61175641 -0.52817175 -1.07296862  0.86540763 -2.3015387
代码语言:javascript
复制
  1.74481176 -0.7612069   0.3190391  -0.24937038]

可以通过将该值乘以标准差并且从期望的缩放分布中加上平均值来缩放来自标准高斯分布的值。如:

代码语言:javascript
复制
scaled value= mean+ value* stdev

其中mean和stdev是所需缩放高斯分布的均值和标准差,value是来自标准高斯分布的随机生成值。

混洗NUMPY数组

可以使用NumPy函数shuffle()随机混洗NumPy数组。

下面的示例演示了如何对NumPy数组进行随机混洗。

代码语言:javascript
复制
# randomly shuffle a sequence
代码语言:javascript
复制
from numpy.randomimport seed
代码语言:javascript
复制
from numpy.randomimport shuffle
代码语言:javascript
复制
# seed random number generator
代码语言:javascript
复制
seed(1)
代码语言:javascript
复制
# prepare a sequence
代码语言:javascript
复制
sequence= [ifor iin range(20)]
代码语言:javascript
复制
print(sequence)
代码语言:javascript
复制
# randomly shuffle the sequence
代码语言:javascript
复制
shuffle(sequence)
代码语言:javascript
复制
print(sequence)

首先运行该示例生成一个包含20个整数值的列表,然后随机混洗并打印混洗后的数组。

代码语言:javascript
复制
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]
代码语言:javascript
复制
[3,16,6,10,2,14,4,17,7,1,13,0,19,18,9,15,8,12,11,5]

进一步阅读

如果希望深入了解,可以访问如下网址。

  • https://en.wikipedia.org/wiki/Pseudorandom_number_generator
  • https://docs.scipy.org/doc/numpy/reference/routines.random.html
  • https://docs.python.org/3/library/random.html
  • https://machinelearningmastery.com/randomness-in-machine-learning/

总结

在本教程中,你了解了如何在Python中生成和使用随机数。

具体来说,你学到了:

  • 可以通过使用伪随机数生成器在程序中应用随机性。
  • 如何通过Python标准库生成随机数和使用随机性。
  • 如何通过NumPy库生成随机数组。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-07-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 ATYUN订阅号 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 教程概述
  • 1.伪随机数生成器
  • 2.Python生成随机数
    • 播种随机数生成器
      • 随机浮点值
        • 随机整数值
          • 随机高斯值
            • 从列表中随机选择
              • 列表中的随机子样本
                • 随机混洗列表
                • 3.使用NumPy生成随机数
                  • 播种随机数生成器
                    • 随机浮点值数组
                      • 随机整数值数组
                        • 随机高斯值数组
                          • 混洗NUMPY数组
                          • 进一步阅读
                          • 总结
                          相关产品与服务
                          云开发 CloudBase
                          云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档