Python random 模块详解
我们可以先来了解下伪随机数和真随机数的概念。
伪随机数:伪随机数是用确定性的算法计算出来自[0,1]均匀分布的随机数序列。并不真正的随机,但具有类似于随机数的统计特征,如均匀性、独立性等。在计算伪随机数时,若使用的初值(种子)不变,那么伪随机数的数序也不变。伪随机数可以用计算机大量生成,在模拟研究中为了提高模拟效率,一般采用伪随机数代替真正的随机数。模拟中使用的一般是循环周期极长并> > 能通过随机数检验的伪随机数,以保证计算结果的随机性。</br>
---百度百科真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等,这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。</br>
---百度百科
如果觉得上述定义过于笼统的话,可以参考下这篇博客:https://blog.csdn.net/czc1997/article/details/78167705
以下内容基于 Python 3.6 版本 </br>
参考文档:https://docs.python.org/3/library/random.html
Python 的 random 模块概述
根据 Python 官方文档的说明,random 模块提供了不同分布下伪随机数生成器的实现。并且以梅森旋转算法(Mersenne Twister)作为生成器内核进行随机数生成。
random 模块函数列举
基础方法
random.seed(a=None, version=2)
当 a 的值没有设置时,则会使用当前系统时间作为 a 的值传入。从下面的例子中可以看出,设置 seed() 函数传入一个固定值的时候,生成的下一个随机数也会是固定的。
>>> import random
>>> random.seed(1)
>>> random.random()
0.13436424411240122
>>> random.seed(1)
>>> random.random()
0.13436424411240122
>>> random.seed(1)
>>> random.random()
0.13436424411240122
random.getstate()
返回一个捕获到的 生成器当前内部状态 的对象,可以将此对象传递给 setstate() 以恢复到这个状态。
random.setstate()
state 应该是从之前调用 getstate() 获得的,而 setstate() 将生成器的内部状态恢复到调用 getstate() 时的状态。根据下面的例子可以看出,由于生成器内部状态相同时会生成相同的下一个随机数,我们可以使用 getstate() 和 setstate() 对生成器内部状态进行获取和重置到某一状态下。
>>> import random
>>> state = random.getstate()
>>> random.random()
0.15039710215996194
>>> random.random()
0.29023339773680357
>>> random.setstate(state)
>>> random.random()
0.15039710215996194
random.getrandbits(k)
返回一个 0~2^k 的随机整数,该方法随 Mersenne Twister 一起提供,getrandbits() 可以使 randrange() 能够处理任意大的范围。
整数方法
random.randrange(stop)
random.randrange(start, stop[, step])
从 range(start, stop[, step]) 中选择一个随机数返回,但其实并不会创建一个 range(start, stop[, step])
random.randint(a, b)
返回 [a,b] 范围内的整数,它实际上来自于 random.randrange(a, b+1)
序列方法
random.choice(seq)
从非空序列 seq 中随机选取一个元素返回,如果 seq 为空,则会引发 IndexError 。
random.choices(population, weights=None, *, cum_weights=None, k=1)
从 population 序列中随机选取 k 个元素组成列表并返回,如果 population 为空则引发 IndexError 。
random.shuffle(x[, random])
随机打乱序列 x 中的元素排列,可选参数random是一个无参函数,在[0.0,1.0)中返回随机浮点数,默认情况下使用 random() 函数。另外,x 必须是可变序列。如果想打乱不可变序列的元素排列,可以使用 sample(x, k=len(x)) 。
random.sample(population, k)
从 population 序列中随机不重复选取 k 个元素组成列表并返回,并且不会对原序列造成任何影响。返回的列表将按照选择的顺序进行排列。如果 k 大于 population,则会引发 ValueError 。
真值分布
random.random()
返回 [0.0, 1.0) 范围内的下一个随机浮点数。
random.uniform(a, b)
返回 [a, b] 范围内的随机浮点数。
random.triangular(low, high, mode)
random.betavariate(alpha, beta)
β分布。返回的结果在0~1之间
random.expovariate(lambd)
指数分布。 lambd是1.0除以所需的平均值。它应该是非零的。
random.gammavariate(alpha, beta)
Gamma分布。 (不是伽玛函数!)参数的条件是alpha> 0和beta> 0。
random.gauss(mu, sigma)
高斯分布。 mu是平均值,sigma是标准偏差。这比下面定义的normalvariate()函数稍快。
random.lognormvariate(mu, sigma)
记录正态分布。如果你采用这个分布的自然对数,你将获得具有平均μ和标准偏差西格玛的正态分布。 mu可以有任何值,sigma必须大于零。
random.normalvariate(mu, sigma)
正态分布。 mu是平均值,sigma是标准偏差。
random.vonmisesvariate(mu, kappa)
卡帕分布
random.paretovariate(alpha)
帕累托分布。 alpha是形状参数。
random.weibullvariate(alpha, beta)
威布尔分布。 alpha是scale参数,beta是shape参数。