随机模块random

BG46

Posted by Blue Geek on November 8, 2019

随机模块random

By 青衣极客 Blue Geek In 2019-11-08

在通用的编程开发中,关于随机的操作从来都是不可或缺的。除了模拟一些数学随机函数之外,还有对自然现象的模拟,以及在构造测试用例的时候消除个人的偏见。在机器学习中,在初始化待训练参数时常常使用随机的方式,在对一些输入数据加入噪声进行数据增强的时候也常常使用随机操作。在python中,使用内建模块random提供随机的操作。本文就来讨论一下random模块的一些常用的操作。

1. 设置种子

关于计算机产生的随机数,有一点我们需要了解,那就是:计算机产生的所有随机数都是伪随机数,所谓“伪随机”是指表现出是随机数,但实际上是由确定的规律控制,通常这个确定的规律就是随机数表和种子(也称起点)。 随机数表是早就已经在计算机中存储着,因此在编程操作时,通过控制种子就可以控制这种随机性的表现。下面的演示就是验证种子的设置对随机性的影响。

import random
random.seed(0)
print(random.random()) # 设置种子为0,产生的第一个随机数
random.seed(0)
print(random.random()) # 设置种子为0,产生的第一个随机数
random.seed(1)
print(random.random()) # 设置种子为1,产生的第一个随机数
print(random.random()) # 设置种子为1,产生的第二个随机数
0.8444218515250481
0.8444218515250481
0.13436424411240122
0.8474337369372327

从结果来看可以有如下结论: (1)在种子相同的情况下,按顺序出现的随机数完全相同,可用于复现;(1)在种子相同的情况下,可以认为不同次序出现的数字具有随机性; (3) 在种子不同的情况下,可以认为所获取的数据具有随机性。 所以,一般在程序的开始处设置一次随机种子,然后所产生的数据就可以认为都是随机数。这样两次运行程序会得到同样的结果,因为两次运行的初始种子相同,按次序产生的随机数也相同。如果希望每次运行都具有随机性,可以不设置种子,默认是以时间戳为种子,这样就能够使得多次运行的结果都不一样了。

2. 按分布产生随机数

在数学中,常常需要使用一些概率分布,比如均匀分布、正态分布、t分布等等。在python中也可以根据这些分布产生随机数。不过python内建模块提供的随机数产生还是十分简单,特别是对于按照一些分布大量产生随机数而言并不是很方便。针对这一点,可以使用numpy中提供的随机数产生接口。事实上,在实际使用中,需要产生较多随机数的情况下一般都是使用第三方模块进行的,其中numpy最常用。

# 均匀分布产生指定范围内的整数
print([random.randint(0,3) for i in range(10)])
# 均匀分布产生自动范围内的浮点数
print([random.uniform(0,2) for i in range(10)])
[0, 3, 3, 0, 3, 2, 1, 0, 2, 0]
[0.04464422204264773, 1.2990922710509967, 0.018409877108769956, 1.7624677178443109, 1.3729677083581595, 1.938081300588199, 1.4517052028930304, 1.0552588287247964, 1.527401990262979, 1.8783340378971731]

3. 随机操作

使用内建的random模块除了少量获得随机数之外,更常用的是随机操作。比如从输入的数据中随机选择一个,将输入的数据顺序打断,以及从给定的数据中随机采样一些等等。在一些比较完备的第三方库中,比如numpy、tensorflow,就已经提供了类似的随机操作,而且第三方库所提供的随机操作对该库内建数据而言更加便捷高效。那么,内建的random模块发挥作用的情况一般在一些临时性的小项目中,或者在自行开发独立运行的模块中。根据日常开发的经验来看,这样的需求并不算小,因此掌握这种随机操作的方式,对于快速实现自己的小项目而言是非常不错的。

# 从序列中随机取一个元素
a = list(range(10))
print('从序列中随机取一个元素:', random.choice(a))
# 将序列元素重排列
random.shuffle(a)
print('将序列元素重排列', a)
# 从序列中随机取若干个元素
print('从序列中随机取若干个元素', random.sample(a, 3))
从序列中随机取一个元素: 7
将序列元素重排列 [9, 7, 0, 4, 2, 1, 5, 8, 6, 3]
从序列中随机取若干个元素 [6, 7, 0]

到此,关于python中的所及模块random就讨论完毕。

【青衣极客】公众号



COMMENT

博客评论区功能由Github Issue提供,提交Issue时请以本文标题为话题

"BG46-随机模块random"