对数正态分布(对数正态分布是左偏分布)
序
在实际开发中,经常使用随机数生成。随机库专用于随机数生成,它提供了一个基于Mersenne Twister算法的快速伪随机数生成器。
本文将详细讲解随机数在各种场景下的生成和应用。
生成随机数
对于随机数的生成,随机库提供了很多函数,有的负责生成浮点数,有的负责生成整数,还有的可以生成区间随机数。
函数名
参数
意义
随意
没有参数
随机生成[0-1]之间的浮点数
制服
两个整数参数:最小数量和最大数量。
随机生成最小值和最大值之间的浮点数。
产生均匀分布的随机整数矩阵
两个整数参数:最小数量和最大数量。
随机生成一个介于最小值和最大值之间的整数。
兰德兰奇
三个整数参数:最小数、最大数和步长。
随机生成最小值和最大值之间的间隔步长整数。
下面,我们来看看这些常用的随机数生成函数的应用:
import random# 随机生成[0-1]之间浮点数print("%04.2f" % random.random())# 随机生成浮点数print("%04.2f" % random.uniform(100, 200))# 随机生成整型print(random.randint(1, 200))# 随机生成整型print(random.randrange(0, 200, 5))运行后,效果如下:
以上是随机数最常用和最常见的用法。
种子
不知道读者有没有发现。虽然上述方法都可以产生随机数,但是都是乱序的。你这次可能以一个数字开始,以一个数字结束,下一次的开始和结束就不一样了。这显然不适合需要固定序列的随机数要求。
所以随机库给我们提供了种子函数:random.seed()。种子将控制公式生成的第一个值。因为公式是确定的,随机数每次产生的序列值只要种子一样就会一样。
import randomrandom.seed(1)# 随机生成浮点数print("%04.2f" % random.random())# 随机生成浮点数print("%04.2f" % random.uniform(100, 200))# 随机生成整型print(random.randint(1, 200))# 随机生成整型print(random.randrange(0, 200, 5))多次运行上面的代码,你会发现每次的随机数都是一样的。
随机样本
博主经常写脚本刷评论,但是对于爬虫来说,有一个唯一的随机数要求。例如,如果我想评论20个网页,那么如果我把20个网页放在一个数组中,就会有(0,19)个索引可供选择。如果使用通常的区间随机数,可能会漏掉一些值,也就是说也会漏掉一些没有评论的网页。
这时候博主一定要期望产生一个(0,19)范围内的随机数样本,不重复。确保一个周期的评论完成后,不会遗漏任何网页。那么这个需求是如何与随机库一起运作的呢?
当然,字幕已经给出了答案。您可以使用random.sample()函数:
import randomprint(random.sample(range(0, 20), 20))运行后,效果如下:
random.sample的第一个参数是一个区间数组。比如随机数是(0,19),那么第一个参数就是range (0,19);第二是产生多少个不重复的随机数。这里所有网页都需要评论,所以产生了20个随机数。可以看出,上面所有的随机数都是不重复的,都在区间内且唯一。(该功能也可用于扑克牌的分发。有兴趣的读者可以自己写代码,熟练掌握。)
随机元素
在概率统计中,我们经常用随机数来预测概率,比如硬币朝上的概率等等。如果这个求概率的随机元运算是用随机数实现的呢?
答案是random.choice()函数,它可以从序列中随机选择元素。在这里,举个例子,让我们把一枚硬币抛10000次,看看每一面朝上的概率是多少。具体代码如下:
import randomcoin_pro = { 'heads': 0, 'tails': 0,}coin = ['heads', 'tails']for i in range(10000): coin_pro[random.choice(coin)] += 1print("正面朝上次数:", coin_pro['heads'])print("反面朝上次数:", coin_pro['tails'])跑完之后我们会得到次数,所以也可以计算概率。
系统随机
随机库下还有一个Systemrandom类。这个类产生的序列是不可更新的,因为它的随机性是跟随着系统的,而不是来自软件本身。
让我们先来看一段代码:
import randomimport timer1 = random.SystemRandom()print(r1.random())seed = time.time()r1 = random.SystemRandom(seed)print(r1.random())运行后,效果如下:
你可以简单的把SystemRandom理解为系统时间产生的随机数,也就是根据系统时间因子产生的随机数。(只是打个比方),就是上面的种子因子根本不起作用,它只是用了系统的随机种子。
不均匀分布
使用numpy库的读者应该经常使用这个库来生成一些正态分布的值。同样,随机数库也提供了这些分布式函数,用于科学计算。我们来解释一下这些随机数是怎么产生的。
功能
意义
贝塔变量()
根据Beta分布返回一个介于0和1之间的随机浮点数(用于统计)。
指数变量()
根据指数分布(用于统计信息),返回0到1之间或0到-1之间的随机浮点数(如果参数为负)。
伽马变量()
根据伽玛分布返回一个介于0和1之间的随机浮点数(用于统计信息)
高斯()
根据高斯分布(用于概率论)返回一个介于0和1之间的随机浮点数
对数变量()
根据对数正态分布(用于概率论),返回一个介于0和1之间的随机浮点数。
正常变量()
根据正态分布返回一个介于0和1之间的随机浮点数(用于概率论)
vonmisesvariate()
根据von Mises分布返回一个介于0和1之间的随机浮点数(用于方向统计)
帕雷托变量()
根据帕累托分布(用于概率论)返回一个介于0和1之间的随机浮点数
威布尔变量()
根据威布尔分布返回一个介于0和1之间的随机浮点数(用于统计信息)
正态分布
随机库中提供了函数normalvary()和gauss()来生成正态分布(高斯分布)的随机数。当然,还有一个函数lognormvary()也可以生成正态分布,但它生成的正态分布适用于多个非交互随机变量的乘积。
import randomfor i in range(2): print(random.normalvariate(0, 1))for i in range(2): print(random.gauss(0, 1))运行后,效果如下:
上面有两个参数:均值和协方差。平均值是N维中的一个坐标空,表示样本最有可能产生的位置。这类似于具有一维或单变量正态分布的钟形曲线的峰值。协方差表示两个变量一起变化的水平。
近似分布
三角形分布,又称辛普森分布或三角形分布。在概率论与统计中,三角分布是一种下限为A,A型为C,上限为b的连续概率分布。
triangular()方法返回两个指定数字(包括两者)之间的随机浮点数,但您也可以指定第三个参数,即模式参数。模式参数使您有机会权衡可能的结果,并使它们更接近其他两个参数值之一。模式参数默认为其他两个参数值之间的中点,它不会在任何方向上权衡可能的结果。
import randomprint(random.triangular(20, 60, 30))运行后,效果如下:
其他感兴趣的函数可以自己研究。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 ZLME@xxxxxxxx@hotmail.com 举报,一经查实,立刻删除。