一、简单认识random模块
Python官网的解释:
- 该模块实现了各种分布的伪随机数生成器。
- 对于整数,从范围中有统一的选择。 对于序列,存在随机元素的统一选择、用于生成列表的随机排列的函数、以及用于随机抽样而无需替换的函数。
二、本人对计算机中“随机”,“伪随机数”的理解和认识
具体的相关定义可以自行在网上查找,理解的话就看个人意识了,这里仅标明我个人的理解。思考了很多,觉得还是要在这里写一下个人的见解,这样有助于更深入的理解编程语言中“随机数”。
随机是有前提的:即在我们的现实生活中,以我们现在对世界的理解。在这个前提下是存在“随机”的事件的,很多人会将这种情况规划到“玄学”,“命”,“巧合”等等概念里,我本人也是支持这个观点的,因为以现在人类的认知,很多事情是无法用逻辑解释通的,最著名的要数亚伯拉罕·林肯与约翰·肯尼迪两名总统了,感兴趣的可以去查一查。
伪随机数是可以实现的:即人类使用算法等方式,以一个基准(也被叫做种子,最常用的就是时间戳)来构造一系列数字,这些数字的特性符合人们所理解的随机数。但因为是通过算法得到的,所以一旦算法和种子都确定,那么产生的随机数序列也是确定的,所以叫伪随机数。
三、random模块的常用方法
1、random.seed()
这个函数是用来初始化随机数生成器。其输入参数可以不写,不写的时候默认是当前的时间戳,即以当前时间戳为种子生成一系列伪随机数。
random这个模块的方法都是基于算法和种子的,我们平时做简单的随机数操作时可以不显式调用这个方法,而是在使用其他方法时隐式调用调用这个。上面说到,我们计算机用到的其实都是伪随机数,这个“伪”就具体体现在这个方法:不传参数的时候,默认种子为当前时间戳,每次调用的时间戳是不同的,所以生成的随机数序列也不一样,但是当我们显式设定好同一个种子时,无论如何调用,其产生的伪随机序列都是一样的。
我们在这个例子中可以看到,没有显式设定种子时,每次输出的随机数都是不一样的;显式设定种子时,每次输出的随机数都是一样的。
我们还要注意到,既然叫随机数生成器,那么就符合迭代器和生成器的特点(从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退)。在同一个代码段中,只要没有重新设定随机数生成器,那么执行多次获取的随机数,在所有伪随机数序列中是连续的。如果重新设定了随机数生成器,那么取值也将从头开始 这么说可能不太清楚,我们举个例子就清楚了。
通过固定种子,我们可以利用随机数的代码来实现非随机数的功能。
关于代码段的描述,我在这篇文章中有提到其含义:Python学习------缓存重用机制
2、其余一些常用方法
我们已经找到了伪随机数的生成规律了,接下来的方法就仅仅是针对不同的使用场景而分化出来的了,这一部分看看官网会用就可以了,有一些我没有使用到,也不清楚有没有什么巧妙的地方,所以这里简单的罗列一下
random.random()----随机返回一个0.0 <= N < 1.0之间的浮点数。
random.uniform(a,b)----随机返回一个a<= N <= b的浮点数。
random.randint(a,b)----随机返回一个a <= N <= b的整数。
random.randrange(start,stop,step)----随机返回指定递增基数为step的集合中的一个整数,基数默认值为1,start <= N < stop。在例子random.randrange(10, 20, 3)中,实际的输出值是[10, 13, 16, 19]之一。
random.choice(seq)----从非空序列seq中随机返回一个元素。
random.getrandbits(k)----随机生成一个占内存k位以内的整数。在例子random.getrandbits(3)中,实际的输出值在000-111之间
random.choices(seq, weights=None, *, cum_weights=None, k=1)----choice()函数的升级版,3.6版本新增。可以通过权重来影响实际输出值的概率。
random.sample(seq, n)----从总体中随机不重复选择n个元素,组成新列表作为结果返回。总体里的元素可以重复,比如[1, 1, 1, 1, 1]。
random.shuffle(seq)----在原列表的基础上打乱列表的排列顺序,无返回值。
random.getstate()----捕获并返回生成器当前内部状态的对象,可以把它传递给setstate()函数来把生成器内部状态恢复到调用getstate()函数之前的状态。相当于备份。
random.setstate(state)----state应为getstate()函数的结果,用来把生成器当前的内部状态恢复为state。
random.gauss()----高斯分布
random.triangular()----三角分布
random.betavariate()----Beta分布
random.expovariate()----指数分布
random.gammavariate()----伽马分布
random.lognormvariate()----对数正态分布
random.normalvariate----正态分布
random.vonmisesvariate----von Mises分布
random.paretovariate----pareto分布
random.weibullvariate----weibull分布
四、参考文献
python官方文档:https://docs.python.org/zh-cn/3.7/library/random.html#random.Random