Python random 模块详解

2018-07-18  本文已影响0人  a479a910abe7

我们可以先来了解下伪随机数和真随机数的概念。

伪随机数:伪随机数是用确定性的算法计算出来自[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参数。

上一篇下一篇

猜你喜欢

热点阅读