目录

Python随机数生成一random模块

Python随机数生成(一):random模块

Python随机数生成(一):random模块

在Python中 随机数生成 主要有两种途径,一是利用 random模块 生成,二是利用 numpy库中random函数 生成。在我们日常使用中,如果是为了得到 随机的单个数 ,多考虑 random模块 ;如果是为了得到 随机小数或者整数的矩阵 ,就多考虑 numpy中的random函数

除此之外, scipy.stats模块 也可以生成随机数和特定分布的随机数。

其他方式生成随机数见笔者的其他文章:

random模块生成随机数

(1)生成随机整数

① random.randint(a, b)

功能: 返回随机整数 N 满足 a ≤ N ≤ b。相当于 randrange(a, b+1)。

用法:

import random
number = random.randint(3,7)
# 输出:6
② random.randrange(start, stop[, step])

功能: 在生成的<以a为始,每step递增,以b为终>这样的一个整数序列中随机选择一个数。[, step]代表该参数是可选参数。

用法:

import random
number = random.randrange(2,8,2)
# 输出:6

(2)生成随机浮点数

① random.random()

功能: 生成一个[0,1) 间的随机浮点数。

用法:

import random
number = random.random()
# 输出:0.7365131579088379
② random.uniform(a, b)

功能: 返回一个a,b间的随机浮点数N,当 a ≤ b 则N的范围为[a,b],当 b < a 则N的范围为[b,a]。

用法:

import random
number = random.uniform(1,4)
# 输出:1.8288291918995063

(3)从指定序列中生成随机数

① random.choice(seq)

功能: 从序列seq中随机选择一个元素。

用法:

import random
a = random.choice(range(1,10))
# 输出:4
b = random.choice('abcdefg')
# 输出:e
② random.choices(seq, weights=None, *, cum_weights=None, k=1)

功能: 从序列seq中以 指定的权重 随机选择k个元素,返回一个新的列表。

  • 如果指定了 weight 序列,则根据 相对权重 进行选择。
  • 如果指定了 cum_weights 序列,则根据 累积权重 进行选择。
  • 如果既未指定 weight 也未指定 cum_weights ,则以 相等的概率 进行选择。
  • 如果提供了 权重序列 ,则它必须 与 seq 序列的长度相同

用法:

import random
a = random.choices(['red', 'black', 'green'], [18, 18, 2], k=6)
# 输出:['red', 'black', 'red', 'red', 'black', 'red']
③ random.sample(seq, k)

功能: 从序列seq中随机选择k个元素,返回一个新的列表。

用法:

import random
a = ['小红','小兰','小王','小张','小梁']
b = random.sample(a,2)
# 输出:['小梁', '小王']
④ random.shuffle(seq)

功能: 将序列seq中的元素随机排序。

用法:

import random
a = ['小红','小兰','小王','小张','小梁']
random.shuffle(a) # 打乱这个操作不需要重新定义对象,它作用的是对象本身
# 输出:['小兰', '小王', '小红', '小梁', '小张']

(4)生成特定分布的随机数

1、均匀分布

均匀分布,就是在事件空间中,所有事件的概率都是相等的连续分布,其概率密度为

https://i-blog.csdnimg.cn/blog_migrate/e474969f26ac942d0ae64490d15ab84a.png

其均值为(a+b)/2 ,方差为(b−a)^2/12

① random.random()

功能: 生成一个[0,1) 间的随机浮点数。

用法见前文。

② random.uniform(a, b)

功能: 返回一个a,b间的随机浮点数N,当 a ≤ b 则N的范围为[a,b],当 b < a 则N的范围为[b,a]。

用法见前文。

2、三角分布

对于下限为a,上限为b,众数为c的三角分布,其概率密度函数为

https://i-blog.csdnimg.cn/blog_migrate/f63f5d385ed096e5714ab190bf9e0ec4.png

① random.triangular(low, high, mode)

功能: 返回一个三角分布的随机浮点数 N ,使得 low ≤ N ≤ high ,mode指明众数出现的位置 。 low 和 high 默认为0和1。 mode 参数默认为 low 和 high 之间的中点,给出一个对称的三角分布。

用法:

import random
import matplotlib.pyplot as plt
import seaborn as sns
data = [random.triangular(2,3,2.5) for i in range(20000)]
plt.hist(data, bins=100, color="#FF0000", alpha=.7) # 直方图
sns.kdeplot(data, shade=True,color="#FF0000")#密度图

直方图:

https://i-blog.csdnimg.cn/blog_migrate/1e84617d2af328598f50a9f53efb71a6.png

密度图:

https://i-blog.csdnimg.cn/blog_migrate/7c59b0f5d4c961855e9045b18eb09c2d.png

3. 指数分布

指数分布为连续型分布,概率密度函数为:

https://i-blog.csdnimg.cn/blog_migrate/901931276e3e1d20bc4e121ea67fe4ac.png

分布函数为:

https://i-blog.csdnimg.cn/blog_migrate/28d8bfa491cf05589cad03c47de8a4fc.png

期望: https://i-blog.csdnimg.cn/blog_migrate/6d5ced3facbecbd3032a0d155c961b1e.png , 方差: https://i-blog.csdnimg.cn/blog_migrate/fb83d25601c1c62a550ba8fb3c3e8461.png

① random.expovariate(lambd)

功能: 指数分布。 lambd 是 1.0 除以所需的平均值,它应该是非零的。 (该参数本应命名为 “lambda” ,但这是 Python 中的保留字。)如果 lambd 为正,则返回值的范围为 0 到正无穷大;如果 lambd 为负,则返回值从负无穷大到 0。

用法:

import random
import matplotlib.pyplot as plt
import seaborn as sns
data = [random.expovariate(2) for i in range(50000)]
plt.hist(data, bins=100, color="#FF0000", alpha=.7) # 直方图
sns.kdeplot(data, shade=True,color="#FF0000") # 密度图

直方图:

https://i-blog.csdnimg.cn/blog_migrate/d584897559ac48b6c9f6ffbae6dabb1a.png

密度图:

https://i-blog.csdnimg.cn/blog_migrate/8c7c02a5e8fccfe4b55348c82dc2dafb.png

4. 正态分布

① random.normalvariate(mu, sigma)

功能: 正态分布。 mu 是平均值,sigma 是标准差。

用法:

import random
import matplotlib.pyplot as plt
import seaborn as sns
data = [random.normalvariate(2,4) for i in range(20000)]
plt.hist(data, bins=100, color="#FF0000", alpha=.7) # 直方图
sns.kdeplot(data, shade=True,color="#FF0000") # 密度图

直方图:

https://i-blog.csdnimg.cn/blog_migrate/c019f1b0a8e570b2b54d6d51c37d64c8.png

密度图:

https://i-blog.csdnimg.cn/blog_migrate/2cab2f44ce84ca6bb3d326bee2b74bc0.png

5. 对数正态分布

① random.lognormvariate(mu, sigma)

功能: 对数正态分布。 若采用这个分布的自然对数,将得到一个平均值为 mu 和标准差为 sigma的正态分布 。 mu 可以是任何值,sigma 必须大于零。

用法:

import random
import matplotlib.pyplot as plt
import seaborn as sns
data = [random.lognormvariate(4,2) for i in range(50000)]
plt.hist(data, bins=100, color="#FF0000", alpha=.7) # 直方图
sns.kdeplot(data, shade=True,color="#FF0000") # 密度图

直方图:

https://i-blog.csdnimg.cn/blog_migrate/b4f9d7f95137808292e53776ffa59ad1.png

密度图:

https://i-blog.csdnimg.cn/blog_migrate/a96ea29e001dc8b0892e540be3554cb9.png

6. 高斯分布

① random.gauss(mu, sigma)

功能: 高斯分布。 mu 是平均值,sigma 是标准差。 这比random.normalvariate(mu, sigma)函数略快。

用法:

import random
import matplotlib.pyplot as plt
import seaborn as sns
data = [random.gauss(2,2) for i in range(50000)]
plt.hist(data, bins=100, color="#FF0000", alpha=.7) # 直方图
sns.kdeplot(data, shade=True,color="#FF0000") # 密度图

直方图:

https://i-blog.csdnimg.cn/blog_migrate/10765639da1e974dfb4788f6f9699f0b.png

密度图:

https://i-blog.csdnimg.cn/blog_migrate/bb368d5e822de4c2b5911f1634433575.png

7. Beta分布

① random.betavariate(alpha, beta)

功能: Beta 分布。 参数的条件是 alpha > 0 和 beta > 0。 返回值的范围介于 0 和 1 之间。

用法:

import random
import matplotlib.pyplot as plt
import seaborn as sns
data = [random.betavariate(1,2) for i in range(20000)]
plt.hist(data, bins=100, color="#FF0000", alpha=.7) # 直方图
sns.kdeplot(data, shade=True,color="#FF0000") # 密度图

直方图:

https://i-blog.csdnimg.cn/blog_migrate/a4bfbccc504ac9e9ba1367e4246cfaab.png

密度图:

https://i-blog.csdnimg.cn/blog_migrate/a56d35fe6a22dd889ad2c04b71dbd887.png

8. Gamma分布

① random.gammavariate(alpha, beta)

功能: Gamma 分布。( 不是 gamma 函数!)参数的条件是 alpha > 0 和 beta > 0。

用法:

import random
import matplotlib.pyplot as plt
import seaborn as sns
data = [random.gammavariate(2,2) for i in range(50000)]
plt.hist(data, bins=100, color="#FF0000", alpha=.7) # 直方图
sns.kdeplot(data, shade=True,color="#FF0000") # 密度图

直方图:

https://i-blog.csdnimg.cn/blog_migrate/03abfadf20f10371886f8351b2583f59.png

密度图:

https://i-blog.csdnimg.cn/blog_migrate/84d6957621a35de73c8c38e4e04b9715.png

9. 帕累托分布

帕累托在1906年提出了有关意大利社会财富分配的分配规律,即20%的人口掌握了80%的财富,这个规律后来被发现十分普遍,以至于约瑟夫·朱兰后来将其称为帕累托法则,也被成为八二法则。

帕累托分布正是对这一规则的描述,其概率分布函数为

https://i-blog.csdnimg.cn/blog_migrate/d08920b20ea30376eba2316d1d517a8c.png

① random.paretovariate(alpha)

功能: 帕累托分布。 alpha 是形状参数。

用法:

import random
import matplotlib.pyplot as plt
import seaborn as sns
data = [random.paretovariate(4) for i in range(50000)]
plt.hist(data, bins=100, color="#FF0000", alpha=.7) # 直方图
sns.kdeplot(data, shade=True,color="#FF0000") # 密度图

直方图:

https://i-blog.csdnimg.cn/blog_migrate/17d51a14f99d36eff32bab54a139780c.png

密度图:

https://i-blog.csdnimg.cn/blog_migrate/4c7ec883c5e36b59a4509f3589b0d26a.png

10. 威布尔分布

① random.weibullvariate(alpha, beta)

功能: 威布尔分布。 alpha 是比例参数,beta 是形状参数。

用法:

import random
import matplotlib.pyplot as plt
import seaborn as sns
data = [random.weibullvariate(1,2) for i in range(20000)]
plt.hist(data, bins=100, color="#FF0000", alpha=.7) # 直方图
sns.kdeplot(data, shade=True,color="#FF0000") # 密度图

直方图:

https://i-blog.csdnimg.cn/blog_migrate/06f9c048a1fa89b9825d331ac715806a.png

密度图:

https://i-blog.csdnimg.cn/blog_migrate/499a11e3ee0d1263693198711c8537a6.png

11. 冯·米塞斯分布

① random.vonmisesvariate(mu, kappa)

功能: 冯·米塞斯分布。 mu 是平均角度,以弧度表示,介于0和 2 pi 之间,kappa 是浓度参数,必须大于或等于零。 如果 kappa 等于零,则该分布在 0 到 2 pi 的范围内减小到均匀的随机角度。

用法:

import random
import matplotlib.pyplot as plt
import seaborn as sns
data = [random.vonmisesvariate(2,2) for i in range(20000)]
plt.hist(data, bins=100, color="#FF0000", alpha=.7) # 直方图
sns.kdeplot(data, shade=True,color="#FF0000") # 密度图

直方图:

https://i-blog.csdnimg.cn/blog_migrate/1ae3f6a1fe9d8f0e40772c6b8003087b.png

密度图:

https://i-blog.csdnimg.cn/blog_migrate/a5a9425b4ab402330a80e1bbd51fd212.png

参考文献