栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【python标准库】伪随机数模块random详解

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【python标准库】伪随机数模块random详解

文章目录
    • 基本原理
    • 整数和字节
    • 分布函数
    • 用于序列的随机函数

基本原理

用于生成伪随机数,之所以有个伪字,是因为计算机没法生成真正的随机数。所谓伪随机数,无非是把一个初始值变得面目全非,从而很像随机数。

而这个初始值,便是通过seed实现的,如果不设置,则默认为当前的系统时间。

在ramdom中,使用最多的应该就是random.random()了,其功能为返回一个 [ 0 , 1 ) [0,1) [0,1)区间的实数。接下来可以通过random.random()来验证以下random.seed()的功能。

>>> def rand(n):
...   random.seed(n)
...   print(random.random())
...   print(random.random())
...
>>> rand(3)
0.23796462709189137
0.5442292252959519
>>> rand(3)
0.23796462709189137
0.5442292252959519

使用seed的一个好处是方便算法复现,比如用某个随机数做算法,然后换了个随机数之后发现算法不对了,这个时候非常尴尬,这个时候seed就派上了用场。

相比之下,getstate和setstate更加强大,可以获取或设置当前的状态。

>>> a = random.getstate()
>>> random.random()
0.36995516654807925
>>> random.random()
0.6039200385961945
>>> random.setstate(a)
>>> random.random()
0.36995516654807925
>>> random.random()
0.6039200385961945
整数和字节

接下来的所有代码默认from random import *。

randbytes(n)生成n个字节
randrange(b)生成一个[0,b]之间的整数
randrange(a,b,step=1)在range(a,b,step)中随机选一个数
randint(a,b)相当于randrange(a, b+1)
getrandbits(k)相当于randint(0,2**k)
分布函数

random中的分布函数均为浮点型。

分布函数 f ( x ) f(x) f(x)
uniform(a,b)[a,b]间均匀分布 1 ∥ b − a ∥ , x ∈ [ a , b ] frac{1}{|b-a|}, xin[a,b] ∥b−a∥1​,x∈[a,b]
triangular(a,b,mid)三角分布
betavariate(a,b) β beta β分布 Γ ( a + b ) Γ ( a ) Γ ( b ) x a − 1 ( 1 − x ) b − 1 frac{Gamma(a+b)}{Gamma(a)Gamma(b)}x^{a-1}(1-x)^{b-1} Γ(a)Γ(b)Γ(a+b)​xa−1(1−x)b−1
expovariate(a)指数分布 a ⋅ e − a x x > 0 acdot e^{-ax}quad x>0 a⋅e−axx>0
gammavariate(a,b) γ gamma γ分布 x a − 1 exp ⁡ ( − x b ) Γ ( a ) ∗ b a frac{x^{a-1}exp(frac{-x}{b})}{Gamma(a)*b^a} Γ(a)∗baxa−1exp(b−x​)​
gauss(b,c)正态分布 1 2 π c exp ⁡ ( x − b ) 2 2 c 2 frac{1}{sqrt{2pi}c}expfrac{(x-b)^2}{2c^2} 2π ​c1​exp2c2(x−b)2​
normalvariate(b,c)正态分布,慢于gauss 1 2 π c exp ⁡ ( x − b ) 2 2 c 2 frac{1}{sqrt{2pi}c}expfrac{(x-b)^2}{2c^2} 2π ​c1​exp2c2(x−b)2​
lognormvariate(b,c)对数正态分布 1 c x 2 π exp ⁡ ( ln ⁡ x − b ) 2 2 c 2 frac{1}{cxsqrt{2pi}}expfrac{(ln x-b)^2}{2c^2} cx2π ​1​exp2c2(lnx−b)2​
vonmisesvariate(a,b)冯·米塞斯分布 exp ⁡ [ b cos ⁡ ( x − a ) 2 π J 0 ( b ) ] exp[frac{bcos(x-a)}{2pi J_0(b)}] exp[2πJ0​(b)bcos(x−a)​]
paretovariate(a)帕累托分布 x − a x^{-a} x−a
weibullvariate(a,b)韦伯分布 b a ( x a ) b − 1 exp ⁡ [ − ( x a ) b ] frac{b}{a}(frac{x}{a})^{b-1}exp[-(frac{x}{a})^b] ab​(ax​)b−1exp[−(ax​)b]

注:

Γ ( x ) = ∫ 0 + ∞ t z − 1 e − t d t ( x > 0 ) Gamma(x)=int^{+infty}_0t^{z-1}e^{-t}text dtquad(x>0) Γ(x)=∫0+∞​tz−1e−tdt(x>0)

J 0 ( x ) = ∑ m = 0 ∞ ( − 1 ) m m ! Γ ( m + 1 ) ( x 2 ) 2 m J_0(x)=sum_{m=0}^inftyfrac{(-1)^m}{m!Gamma(m+1)}(frac{x}{2})^{2m} J0​(x)=∑m=0∞​m!Γ(m+1)(−1)m​(2x​)2m

通过matplotlib可绘制一下分布的形状,以正态分布为例:

import matplotlib.pyplot as plt
xs = [gauss(0,1) for _ in range(10000)]
plt.hist(xs,1000)
plt.show()

用于序列的随机函数
  • choice(lst):从lst中随机选择一个数
  • shuffle(lst):把lst打乱
  • sample(lst, k, counts=None):从lst中选出k个数,counts代表lst中对应元素的个数,为整数。

choices(lst,weights=None, cum_weights=None, k=1):从lst中选择一个子列表

  • k为元素个数
  • weights为相对权重数组,长度与lst相同,每个元素都大于0,代表对应元素出现的概率权重,
  • cum_weights为累加权重数组,长度与lst相同
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/348011.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号