random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串。

•random.seed(x)改变随机数生成器的种子seed。
一般不必特别去设定seed,Python会自动选择seed。
•random.random() 用于生成一个随机浮点数n,0 <= n < 1
•random.uniform(a,b) 用于生成一个指定范围内的随机浮点数,生成的随机整数a<=n<=b;
•random.randint(a,b) 用于生成一个指定范围内的整数,a为下限,b为上限,生成的随机整数a<=n<=b;若a=b,则n=a;若a>b,报错
•random.randrange([start], stop [,step]) 从指定范围[start,stop)内,按指定基数递增的集合中获取一个随机数,基数缺省值为1
•random.choice(sequence) 从序列中获取一个随机元素,参数sequence表示一个有序类型,并不是一种特定类型,泛指list,tuple,字符串等
•random.shuffle(x[,random]) 用于将一个列表中的元素打乱 (洗牌),会改变原始列表
•random.sample(sequence,k) 从指定序列中随机获取k个元素作为一个片段返回,不会改变原有序列
那么现在基础知识有了,我们来实现一个加权随机算法:
加权随机算法一般应用在以下场景:有一个集合S,里面比如有A,B,C,D这四项。这时我们想随机从中抽取一项,但是抽取的概率不同,比如我们希望抽到A的概率是50%,抽到B和C的概率是20%,D的概率是10%。一般来说,我们可以给各项附一个权重,抽取的概率正比于这个权重。那么上述集合就成了:
{A:5,B:2,C:2,D:1}
方法一:
最简单的方法可以这样:
把序列按权重值扩展成:lists=[A,A,A,A,A,B,B,C,C,D],然后random.choice(lists)随机选一个就行。虽然这样选取的时间复杂度是O(1),但是数据量一大,空间消耗就太大了。
# coding:utf-8
import random
def weight_choice(list, weight):
"""
:param list: 待选取序列
:param weight: list对应的权重序列
:return:选取的值
"""
new_list = []
for i, val in enumerate(list):
new_list.extend(val * weight[i])
return random.choice(new_list)
if __name__ == "__main__":
print(weight_choice(['A', 'B', 'C', 'D'], [5, 2, 2, 1]))
方法二:
比较常用的方法是这样:
计算权重总和sum,然后在1到sum之间随机选择一个数R,之后遍历整个集合,统计遍历的项的权重之和,如果大于等于R,就停止遍历,选择遇到的项。
还是以上面的集合为例,sum等于10,如果随机到1-5,则会在遍历第一个数字的时候就退出遍历。符合所选取的概率。
选取的时候要遍历集合,它的时间复杂度是O(n)。
# coding:utf-8
import random
list = ['A', 'B', 'C', 'D']
def weight_choice(weight):
"""
:param weight: list对应的权重序列
:return:选取的值在原列表里的索引
"""
t = random.randint(0, sum(weight) - 1)
for i, val in enumerate(weight):
t -= val
if t < 0:
return i
if __name__ == "__main__":
print(list[weight_choice([5, 2, 2, 1])])
方法三:
可以先对原始序列按照权重排序。这样遍历的时候,概率高的项可以很快遇到,减少遍历的项。(因为rnd递减的速度最快(先减去最大的数))
比较{A:5,B:2,C:2,D:1}和{B:2,C:2,A:5,D:1}
前者遍历步数的期望是5/10*1+2/10*2+2/10*3+1/10*4=19/10而后者是2/10*1+2/10*2+5/10*3+1/10*4=25/10。
这样提高了平均选取速度,但是原序列排序也需要时间。
先搞一个权重值的前缀和序列,然后在生成一个随机数t后,可以用二分法来从这个前缀和序列里找,那么选取的时间复杂度就是O(logn)了。
# coding:utf-8
import random
import bisect
list = ['A', 'B', 'C', 'D']
def weight_choice(weight):
"""
:param weight: list对应的权重序列
:return:选取的值在原列表里的索引
"""
weight_sum = []
sum = 0
for a in weight:
sum += a
weight_sum.append(sum)
t = random.randint(0, sum - 1)
return bisect.bisect_right(weight_sum, t)
if __name__ == "__main__":
print(list[weight_choice([5, 2, 2, 1])])
以上这篇python的random模块及加权随机算法的python实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# 加权随机算法
# Python3 Random模块代码详解
# Python random模块(获取随机数)常用方法和使用例子
# Python random模块常用方法
# Python中random模块生成随机数详解
# Python实现简单生成验证码功能【基于random模块】
# python 中random模块的常用方法总结
# Python随机数用法实例详解【基于random模块】
# Python中random模块用法实例分析
# Python3.5内置模块之random模块用法实例分析
# 遍历
# 随机数
# 给大家
# 浮点数
# 是这样
# 如有
# 可以用
# 一大
# 我们可以
# 就行
# 希望能
# 作为一个
# 为例
# 这篇
# 报错
# 用在
# 最简单
# 来实现
# 太大了
# 可以利用
相关文章:
如何快速使用云服务器搭建个人网站?
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
教程网站设计制作软件,怎么创建自己的一个网站?
广东专业制作网站有哪些,广东省能源集团有限公司官网?
建站之星微信建站一键生成小程序+多端营销系统
如何在阿里云部署织梦网站?
IOS倒计时设置UIButton标题title的抖动问题
网站制作新手教程,新手建设一个网站需要注意些什么?
南平网站制作公司,2025年南平市事业单位报名时间?
湖州网站制作公司有哪些,浙江中蓝新能源公司官网?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
北京网站制作网页,网站升级改版需要多久?
建站之星安装路径如何正确选择及配置?
网站设计制作公司地址,网站建设比较好的公司都有哪些?
如何在自有机房高效搭建专业网站?
宝塔面板创建网站无法访问?如何快速排查修复?
在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?
电商网站制作公司有哪些,1688网是什么意思?
北京制作网站的公司,北京铁路集团官方网站?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
建站之星下载版如何获取与安装?
css网站制作参考文献有哪些,易聊怎么注册?
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何在VPS电脑上快速搭建网站?
上海网站制作开发公司,上海买房比较好的网站有哪些?
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?
如何在宝塔面板中创建新站点?
建站之星IIS配置教程:代码生成技巧与站点搭建指南
长沙企业网站制作哪家好,长沙水业集团官方网站?
小米网站链接制作教程,请问miui新增网页链接调用服务有什么用啊?
如何在七牛云存储上搭建网站并设置自定义域名?
如何在阿里云购买域名并搭建网站?
建站之星如何保障用户数据免受黑客入侵?
网站制作公司广州有几家,广州尚艺美发学校网站是多少?
制作销售网站教学视频,销售网站有哪些?
高防服务器:AI智能防御DDoS攻击与数据安全保障
如何高效配置香港服务器实现快速建站?
制作证书网站有哪些,全国城建培训中心证书查询官网?
建站之星体验版:智能建站系统+响应式设计,多端适配快速建站
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
建站之星如何快速更换网站模板?
Python路径拼接规范_跨平台处理说明【指导】
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
高性能网站服务器部署指南:稳定运行与安全配置优化方案
郑州企业网站制作公司,郑州招聘网站有哪些?
建站之星如何实现PC+手机+微信网站五合一建站?
相册网站制作软件,图片上的网址怎么复制?
*请认真填写需求信息,我们会在24小时内与您取得联系。