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

在Python中随机数生成主要有两种途径,一是利用random模块生成,二是利用numpy库中random函数生成。在我们日常使用中,如果是为了得到随机的单个数,多考虑random模块;如果是为了得到随机小数或者整数的矩阵,就多考虑numpy中的random函数
除此之外,scipy.stats模块也可以生成随机数和特定分布的随机数。

其他方式生成随机数见笔者的其他文章:
Python随机数生成(二):numpy库中random函数

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、均匀分布

均匀分布,就是在事件空间中,所有事件的概率都是相等的连续分布,其概率密度为
在这里插入图片描述
其均值为(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的三角分布,其概率密度函数为
在这里插入图片描述

① 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")#密度图

直方图:
在这里插入图片描述
密度图:
在这里插入图片描述

3. 指数分布

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


分布函数为:

在这里插入图片描述
期望: , 方差:在这里插入图片描述

① 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") # 密度图

直方图:
在这里插入图片描述

密度图:
在这里插入图片描述

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") # 密度图

直方图:
在这里插入图片描述
密度图:
在这里插入图片描述

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") # 密度图

直方图:
在这里插入图片描述
密度图:
在这里插入图片描述

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") # 密度图

直方图:
在这里插入图片描述
密度图:
在这里插入图片描述

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") # 密度图

直方图:
在这里插入图片描述
密度图:
在这里插入图片描述

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") # 密度图

直方图:
在这里插入图片描述
密度图:
在这里插入图片描述

9. 帕累托分布

帕累托在1906年提出了有关意大利社会财富分配的分配规律,即20%的人口掌握了80%的财富,这个规律后来被发现十分普遍,以至于约瑟夫·朱兰后来将其称为帕累托法则,也被成为八二法则。
帕累托分布正是对这一规则的描述,其概率分布函数为
在这里插入图片描述

① 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") # 密度图

直方图:
在这里插入图片描述
密度图:
在这里插入图片描述

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") # 密度图

直方图:
在这里插入图片描述

密度图:
在这里插入图片描述

11. 冯·米塞斯分布

① random.vonmisesvariate(mu, kappa)

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

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") # 密度图

直方图:
在这里插入图片描述
密度图:
在这里插入图片描述

参考文献

1、Python中随机数的生成
2、Random模块的官方文档

猜你喜欢

转载自blog.csdn.net/weixin_44842318/article/details/129615388