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中的readline()方法的使用
May 24 Python
Python分治法定义与应用实例详解
Jul 28 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
详解Python 装饰器执行顺序迷思
Aug 08 Python
python+opencv打开摄像头,保存视频、拍照功能的实现方法
Jan 08 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
用python求一重积分和二重积分的例子
Dec 06 Python
python实现飞船游戏的纵向移动
Apr 24 Python
浅谈keras中的batch_dot,dot方法和TensorFlow的matmul
Jun 18 Python
Python logging模块异步线程写日志实现过程解析
Jun 30 Python
基于python+selenium自动健康打卡的实现代码
Jan 13 Python
使用pytorch实现线性回归
Apr 11 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
php Xdebug 调试扩展的安装与使用.
2010/03/13 PHP
php中DOMDocument简单用法示例代码(XML创建、添加、删除、修改)
2010/12/19 PHP
关于Zend Studio 配色方案插件的介绍
2013/06/24 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
PHP利用超级全局变量$_POST来接收表单数据的实例
2016/11/05 PHP
PHP多线程模拟实现秒杀抢单
2018/02/07 PHP
PHP正则之正向预查与反向预查讲解与实例
2020/04/06 PHP
JQUERY 设置SELECT选中项代码
2014/02/07 Javascript
Nodejs实现多人同时在线移动鼠标的小游戏分享
2014/12/06 NodeJs
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
webix+springmvc session超时跳转登录页面
2016/10/30 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
2017/04/27 Javascript
Node.js五大应用性能技巧小结(必须收藏)
2017/08/09 Javascript
Vue $emit $refs子父组件间方法的调用实例
2018/09/12 Javascript
vue-router实现嵌套路由的讲解
2019/01/19 Javascript
详解javascript对数组和json数组的操作
2019/04/15 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
微信小程序修改数组长度的问题的解决
2019/12/17 Javascript
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
Python中使用 Selenium 实现网页截图实例
2014/07/18 Python
Django URL传递参数的方法总结
2016/08/28 Python
python实现整数的二进制循环移位
2019/03/08 Python
Anaconda+vscode+pytorch环境搭建过程详解
2020/05/25 Python
将pycharm配置为matlab或者spyder的用法说明
2020/06/08 Python
python Autopep8实现按PEP8风格自动排版Python代码
2021/03/02 Python
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
经济实惠的名牌太阳镜和眼镜:Privé Revaux
2021/02/07 全球购物
旅游业大学生创业计划书
2014/01/31 职场文书
大学生党员自我批评
2014/02/14 职场文书
《夏夜多美》教学反思
2014/02/17 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
文明社区申报材料
2014/08/21 职场文书
群众路线自查自纠工作情况报告
2014/10/28 职场文书
德劲DE1107指针试高灵敏度全波段收音机机评
2022/04/05 无线电
Python语法学习之进程的创建与常用方法详解
2022/04/08 Python