全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

python的random模块及加权随机算法的python实现方法

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模块用法实例分析  # 遍历  # 随机数  # 给大家  # 浮点数  # 是这样  # 如有  # 可以用  # 一大  # 我们可以  # 就行  # 希望能  # 作为一个  # 为例  # 这篇  # 报错  # 用在  # 最简单  # 来实现  # 太大了  # 可以利用 


相关文章: 黑客入侵网站服务器的常见手法有哪些?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  如何在香港服务器上快速搭建免备案网站?  建站之星如何通过成品分离优化网站效率?  学校免费自助建站系统:智能生成+拖拽设计+多端适配  音乐网站服务器如何优化API响应速度?  b2c电商网站制作流程,b2c水平综合的电商平台?  免费ppt制作网站,有没有值得推荐的免费PPT网站?  建站之星后台管理:高效配置与模板优化提升用户体验  淘宝制作网站有哪些,淘宝网官网主页?  C++如何编写函数模板?(泛型编程入门)  制作国外网站的软件,国外有哪些比较优质的网站推荐?  北京的网站制作公司有哪些,哪个视频网站最好?  如何快速打造个性化非模板自助建站?  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  高防服务器如何保障网站安全无虞?  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  ,交易猫的商品怎么发布到网站上去?  外贸公司网站制作哪家好,maersk船公司官网?  网站制作软件有哪些,制图软件有哪些?  深圳网站制作培训,深圳哪些招聘网站比较好?  如何选择高性价比服务器搭建个人网站?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  建站之星云端配置指南:模板选择与SEO优化一键生成  建站中国官网:模板定制+SEO优化+建站流程一站式指南  招贴海报怎么做,什么是海报招贴?  再谈Python中的字符串与字符编码(推荐)  自助网站制作软件,个人如何自助建网站?  如何在万网主机上快速搭建网站?  盘锦网站制作公司,盘锦大洼有多少5G网站?  微信小程序 五星评分(包括半颗星评分)实例代码  linux top下的 minerd 木马清除方法  哈尔滨网站建设策划,哈尔滨电工证查询网站?  python的本地网站制作,如何创建本地站点?  大连网站制作公司哪家好一点,大连买房网站哪个好?  建站主机空间推荐 高性价比配置与快速部署方案解析  网站设计制作企业有哪些,抖音官网主页怎么设置?  七夕网站制作视频,七夕大促活动怎么报名?  山东云建站价格为何差异显著?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  黑客如何通过漏洞一步步攻陷网站服务器?  如何获取上海专业网站定制建站电话?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  宝塔建站助手安装配置与建站模板使用全流程解析  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  制作网站的模板软件,网站怎么建设?  西安专业网站制作公司有哪些,陕西省建行官方网站?  建站之星安装后如何自定义网站颜色与字体? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。