随机数据在平时写 python 脚本时会经常被用到, 比如随机生成 0 和 1 来控制逻辑, 或者从列表中随机选择一个元素 (其实抽奖程序也类似, 就是从公司所有人中随机选择中奖用户) 等等. 这篇文章, 就帮大家整理在 python 中 random 模块使用频率比较高的方法.
常用方法
为了方便大家理解和记忆, 将方法进行了归类:
整数用函数
random.randrange(stop)
随机返回 [0, stop-1] 之间的整数
random.randrange(start, stop, step)
随机返回 [start, stop-1] 之间的整数.
step 是递增计数, 列一个公式你就明白了:(随机生成的值 - start)%step=0
random.randint(start, stop)
随机返回 [start, stop] 之间的整数
random.getrandbits(bits)
用于随机对应 bits 位的整数
随机返回 [0, 2 的 bits 位 - 1] 之间的整数.
最后需要注意一点: 上面的几个方法也是可以随机返回负数的, 只需要参数传承负数就可以了. 下面举个例子:
- # 0-2 之间的整数
- print(random.randrange(3))
- # 1-299 之间的整数, 增长基数是 5
- print(random.randrange(1, 300, 5))
- # 1-20 之间的整数
- print(random.randint(1, 20))
- # -3 到 0 之间的负数
- print(random.randint(-3, 0))
- # -3 到 - 1 之间的负数
- print(random.randrange(-3, 0))
- # 返回 1~2-1 之间的数字
- print(random.randrange(1))
- # 返回 1~2 的 32 次方 - 1 之间的数字
- print(random.getrandbits(32))
- ## 返回值
- 0
- 1
- 17
- 0
- -1
- 0
- 3150567570
浮点型函数
random.random()
随机返回 [0,1) 之间的浮点型数字
random.uniform(a, b)
随机返回 [a,b) 之间的浮点数字
其实上面的两个方法也是符合数学随机分布模式的, 为了方便大家理解, 我这里单独列出来(区别于下面的 数学分布模式), 方便大家在随机生成浮点型数字时, 能少些犹豫.
- # 1. 生成一个 0-1 之间随机浮点数
- print(random.random())
- # 2. 生成一个 a-b 之间的随机浮点数
- print(random.uniform(10, 500))
- print(random.uniform(40, 10))
- # 返回值
- 0.7833926665736892
- 150.2805875943869
- 39.88236257691508
序列函数
顾名思义, 序列函数随机的对象是列表.
random.choice(list)
从 list 随机返回一个元素.
random.choices(list, weights,k)
相当于 random.choice()的升级版本.
weights 是权重, 针对 list 的每个元素都设置权重, 来改变随机的概率.
k 是返回几个元素. 需要注意这个方法返回的是列表.
random.sample( population, k )
3.6 新增功能, 用于从 population 列表中, 返回随机无重复的抽样.
前面提过抽奖, 其实如果你想做一个抽奖系统, 可以用这个方法改造.
random.shuffle(list)
将 list 列表中的元素随机打乱.
对应的例子如下:
- # 从给定的序列中随机选择一个元素
- print(random.choice([1, 2, 3, 4, 5]))
- # random.choice 的升级版本, 还可以指定某个元素对应的权重
- print(random.choices([1, 2, 3, 4, 5], [10, 15, 45, 50, 60]))
- # 打乱某个序列, 从 python3.6 新增的方法
- list_test = [2, 3, 4, 5, 6]
- random.shuffle(list_test)
- print(list_test)
- # 取样, 从某个列表中, 随机选择若干个元素
- print(random.sample([1, 2, 3, 4, 5, 6, 7], k=3))
- # 返回值
- 3
- [5]
- [6, 3, 4, 2, 5]
- [6, 1, 7]
控制 random 的行为
random.seed( a=None, version=2 )
设置 random 的种子值, 怎么理解种子值呢? 大家就想一句话就好了:"种瓜得瓜种豆得豆", 所以一样的种子值, 那么种出来的结果是一样的.
假如现在随机两次, 在调用 random 随机生成数据前, 将 random.seed 设置成一样的值, 则随机生成的值是一样的.
random.getstate()
这个很简单, 就是返回 random 生成器当前的状态的.
random.setstate(state)
这个用于设置 random 的状态
setstate 和 getstate 方法结合起来使用, 可以用于恢复 random 的状态.
对应的例子如下:
- # 验证 seed
- random.seed(1)
- print(random.randrange(1000))
- random.seed(1)
- print(random.randrange(1000))
- # 验证 random 的状态
- state = random.getstate()
- print(random.randrange(1000))
- print(random.randrange(1000))
- random.setstate(state)
- print(random.randrange(1000))
- # 返回结果
- 137
- 137
- 582
- 867
- 582
数学分布模式
下面列的这些方法都是跟数学分布的概念有关系, 说实话大学里学的相关的东西, 都还给老师了, 我查了资料想去理解不同的数学分布的知识, 但是理解起来有些吃力, 不过其实对我们使用的人来说, 只需要理解其能根据一定规则, 随机返回浮点数就可以了.
random.triangular(low, high, mode) 以三角分布的概率分布返回随机数
random.betavariate(alpha, beta) 以 beta 分布的概率分布返回 0 到 1 之间的随机数
random.expovariate() 以指数分布返回随机数
random.gammavariate(alpha, beta) 以 gamma 分布的概率分布返回随机数
random.gauss(mu, sigma) 以高斯分布的概率分布返回随机数
random.lognormvariate(mu, sigma) 以对数正态分布的概率分布返回随机数
random.normalvariate(mu, sigma) 和高斯分布类似
random.vonmisesvariate(mu, kappa) 以 von Mises 分布的概率分布返回随机数
random.paretovariate(alpha) 以 Pareto( 帕累托)分布的概率分布返回随机数
random.weibullvariate(alpha, beta) 以 Weibull(威尔布)分布的概率分布返回随机数
其实大家也不需要完全记住上面的方法, 碰到具体的使用场景, 知道有对应的方法, 能查看文档找到就可以了.
总结
上面帮大家整理了 random 模块高频使用的方法, 相对还是比较简单的, 大家有任何的问题, 欢迎留言.
关注[公众号: 软件测试布道师] , 回复[python] , 即可获取[python 自动化及编程实践资料]
来源: https://www.cnblogs.com/zhouliweiblog/p/12144486.html