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


Posted in Python onJanuary 04, 2017

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实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Python中使用pngquant压缩png图片的教程
Apr 09 Python
Python切换pip安装源的方法详解
Nov 18 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
Apr 23 Python
pygame游戏之旅 如何制作游戏障碍
Nov 20 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
Python3实现汉语转换为汉语拼音
Jul 08 Python
Python爬虫抓取技术的一些经验
Jul 12 Python
基于h5py的使用及数据封装代码
Dec 26 Python
浅谈pymysql查询语句中带有in时传递参数的问题
Jun 05 Python
pytorch随机采样操作SubsetRandomSampler()
Jul 07 Python
Pandas直接读取sql脚本的方法
Jan 21 Python
Python3使用tesserocr识别字母数字验证码的实现
Jan 29 Python
python 实现红包随机生成算法的简单实例
Jan 04 #Python
Python 模板引擎的注入问题分析
Jan 01 #Python
python getopt详解及简单实例
Dec 30 #Python
浅谈编码,解码,乱码的问题
Dec 30 #Python
Python实现将数据库一键导出为Excel表格的实例
Dec 30 #Python
python脚本实现数据导出excel格式的简单方法(推荐)
Dec 30 #Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 #Python
You might like
基于HTTP长连接的&quot;服务器推&quot;技术的php 简易聊天室
2009/10/31 PHP
php在程序中将网页生成word文档并提供下载的代码
2012/10/09 PHP
浅谈本地WAMP环境的搭建
2015/05/13 PHP
用PHP写的一个冒泡排序法的函数简单实例
2016/05/26 PHP
PHP实现的redis主从数据库状态检测功能示例
2017/07/20 PHP
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
jQuery源码中的chunker 正则过滤符分析
2012/07/31 Javascript
Javascript中的匿名函数与封装介绍
2015/03/15 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
Javascript中的 “&amp;” 和 “|” 详解
2017/02/02 Javascript
js实现适合新闻类图片的轮播效果
2017/02/05 Javascript
js省市区级联查询(插件版&amp;无插件版)
2017/03/21 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
JS块级作用域和私有变量实例分析
2019/05/11 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
[00:10]DOTA2 TI9勇士令状明日上线
2019/05/07 DOTA
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
Python用csv写入文件_消除空余行的方法
2018/07/06 Python
如何在Python中实现goto语句的方法
2019/05/18 Python
Django高级编程之自定义Field实现多语言
2019/07/02 Python
Python测试模块doctest使用解析
2019/08/10 Python
Python3 pandas 操作列表实例详解
2019/09/23 Python
Keras构建神经网络踩坑(解决model.predict预测值全为0.0的问题)
2020/07/07 Python
Python join()函数原理及使用方法
2020/11/14 Python
Python虚拟环境virtualenv创建及使用过程图解
2020/12/08 Python
PyQt实现计数器的方法示例
2021/01/18 Python
购买200个世界上最好的内衣品牌:Bare Necessities
2017/02/11 全球购物
中专自荐信
2013/10/13 职场文书
成绩单公证书
2014/04/10 职场文书
消防安全责任书范本
2014/04/15 职场文书
个人债务授权委托书范本
2014/10/05 职场文书
2014年乡镇安全生产工作总结
2014/12/02 职场文书
《静夜思》教学反思
2016/02/17 职场文书
七年级作文之我的梦想
2019/10/16 职场文书