Python随机数生成(一):random模块
random模块生成随机数(1)生成随机整数① random.randint(a, b)② random.randrange(start, stop[, step]) (2)生成随机浮点数① random.random()② random.uniform(a, b) (3)从指定序列中生成随机数① random.choice(seq)② random.choices(seq, weights=None, *, cum_weights=None, k=1)③ random.sample(seq, k)④ random.shuffle(seq) (4)生成特定分布的随机数1、均匀分布① random.random()② random.uniform(a, b) 2、三角分布① random.triangular(low, high, mode) 3. 指数分布① random.expovariate(lambd) 4. 正态分布① random.normalvariate(mu, sigma) 5. 对数正态分布① random.lognormvariate(mu, sigma) 6. 高斯分布① random.gauss(mu, sigma) 7. Beta分布① random.betavariate(alpha, beta) 8. Gamma分布① random.gammavariate(alpha, beta) 9. 帕累托分布① random.paretovariate(alpha) 10. 威布尔分布① random.weibullvariate(alpha, beta) 11. 冯·米塞斯分布① random.vonmisesvariate(mu, kappa) 参考文献在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 randomnumber = random.randint(3,7)# 输出:6
② random.randrange(start, stop[, step])
功能:在生成的<以a为始,每step递增,以b为终>这样的一个整数序列中随机选择一个数。[, step]代表该参数是可选参数。
用法:
import randomnumber = random.randrange(2,8,2)# 输出:6
(2)生成随机浮点数
① random.random()
功能:生成一个[0,1) 间的随机浮点数。
用法:
import randomnumber = random.random()# 输出:0.7365131579088379
② random.uniform(a, b)
功能:返回一个a,b间的随机浮点数N,当 a ≤ b 则N的范围为[a,b],当 b < a 则N的范围为[b,a]。
用法:
import randomnumber = random.uniform(1,4)# 输出:1.8288291918995063
(3)从指定序列中生成随机数
① random.choice(seq)
功能:从序列seq中随机选择一个元素。
用法:
import randoma = random.choice(range(1,10))# 输出:4b = random.choice('abcdefg')# 输出:e
② random.choices(seq, weights=None, *, cum_weights=None, k=1)
功能:从序列seq中以指定的权重随机选择k个元素,返回一个新的列表。
如果指定了 weight 序列,则根据相对权重进行选择。如果指定了 cum_weights 序列,则根据累积权重进行选择。如果既未指定 weight 也未指定 cum_weights ,则以相等的概率进行选择。如果提供了权重序列,则它必须与 seq 序列的长度相同。
用法:
import randoma = random.choices(['red', 'black', 'green'], [18, 18, 2], k=6)# 输出:['red', 'black', 'red', 'red', 'black', 'red']
③ random.sample(seq, k)
功能:从序列seq中随机选择k个元素,返回一个新的列表。
用法:
import randoma = ['小红','小兰','小王','小张','小梁']b = random.sample(a,2)# 输出:['小梁', '小王']
④ random.shuffle(seq)
功能:将序列seq中的元素随机排序。
用法:
import randoma = ['小红','小兰','小王','小张','小梁']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 randomimport matplotlib.pyplot as pltimport seaborn as snsdata = [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 randomimport matplotlib.pyplot as pltimport seaborn as snsdata = [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 randomimport matplotlib.pyplot as pltimport seaborn as snsdata = [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 randomimport matplotlib.pyplot as pltimport seaborn as snsdata = [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 randomimport matplotlib.pyplot as pltimport seaborn as snsdata = [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 randomimport matplotlib.pyplot as pltimport seaborn as snsdata = [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 randomimport matplotlib.pyplot as pltimport seaborn as snsdata = [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 randomimport matplotlib.pyplot as pltimport seaborn as snsdata = [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 randomimport matplotlib.pyplot as pltimport seaborn as snsdata = [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 randomimport matplotlib.pyplot as pltimport seaborn as snsdata = [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模块的官方文档