Python实现基于权重的随机数2种方法


Posted in Python onApril 28, 2015

问题:

例如我们要选从不同省份选取一个号码,每个省份的权重不一样,直接选随机数肯定是不行的了,就需要一个模型来解决这个问题。
简化成下面的问题:

 字典的key代表是省份,value代表的是权重,我们现在需要一个函数,每次基于权重选择一个省份出来
{"A":2, "B":2, "C":4, "D":10, "E": 20}

解决:

这是能想到和能看到的最多的版本,不知道还没有更高效好用的算法。

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
#python2.7x 
#random_weight.py 
#author: orangleliu@gmail.com 2014-10-11 
 
''''' 
每个元素都有权重,然后根据权重随机取值 
 
输入 {"A":2, "B":2, "C":4, "D":10, "E": 20} 
输出一个值 
''' 
import random 
import collections as coll 
 
data = {"A":2, "B":2, "C":4, "D":6, "E": 11} 
 
#第一种 根据元素权重值 "A"*2 ..等,把每个元素取权重个元素放到一个数组中,然后最数组下标取随机数得到权重 
def list_method(): 
 all_data = [] 
 for v, w in data.items(): 
  temp = [] 
  for i in range(w): 
   temp.append(v) 
  all_data.extend(temp) 
   
 n = random.randint(0,len(all_data)-1) 
 return all_data[n] 
  
#第二种 也是要计算出权重总和,取出一个随机数,遍历所有元素,把权重相加sum,当sum大于等于随机数字的时候停止,取出当前的元组 
def iter_method(): 
 total = sum(data.values()) 
 rad = random.randint(1,total) 
  
 cur_total = 0 
 res = "" 
 for k, v in data.items(): 
  cur_total += v 
  if rad<= cur_total: 
   res = k 
   break 
 return res 
  
  
def test(method): 
 dict_num = coll.defaultdict(int) 
 for i in range(100): 
  dict_num[eval(method)] += 1 
 for i,j in dict_num.items(): 
  print i, j  
  
if __name__ == "__main__": 
 test("list_method()") 
 print "-"*50 
 test("iter_method()")

一次执行的结果

A 4 
C 14 
B 7 
E 44 
D 31 
-------------------------------------------------- 
A 8 
C 16 
B 6 
E 43 
D 27

思路:

思路都很原始可以参考下面的连接,还有别的好方法一起交流!!
代码: https://gist.github.com/orangle/d83bec8984d0b4293710
参考:
https://3water.com/article/65060.htm
https://3water.com/article/65058.htm

Python 相关文章推荐
Python读写文件方法总结
Jun 09 Python
Python实现爬取逐浪小说的方法
Jul 07 Python
Python的dict字典结构操作方法学习笔记
May 07 Python
Python语言描述随机梯度下降法
Jan 04 Python
详解Python进阶之切片的误区与高级用法
Dec 24 Python
对python读取zip压缩文件里面的csv数据实例详解
Feb 08 Python
django-crontab 定时执行任务方法的实现
Sep 06 Python
flask 框架操作MySQL数据库简单示例
Feb 02 Python
python实现处理mysql结果输出方式
Apr 09 Python
深入了解Python装饰器的高级用法
Aug 13 Python
pycharm不以pytest方式运行,想要切换回普通模式运行的操作
Sep 01 Python
Django后端按照日期查询的方法教程
Feb 28 Python
python使用urllib2实现发送带cookie的请求
Apr 28 #Python
python实现在windows下操作word的方法
Apr 28 #Python
介绍Python的@property装饰器的用法
Apr 28 #Python
Pyhthon中使用compileall模块编译源文件为pyc文件
Apr 28 #Python
在Python中使用__slots__方法的详细教程
Apr 28 #Python
Python实现扫描局域网活动ip(扫描在线电脑)
Apr 28 #Python
python将文本转换成图片输出的方法
Apr 28 #Python
You might like
php mssql 分页SQL语句优化 持续影响
2009/04/26 PHP
php实现把url转换迅雷thunder资源下载地址的方法
2014/11/07 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
PHP实现Session入库/存入redis的方法
2017/05/04 PHP
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
poshytip 基于jquery的 插件 主要用于显示微博人的图像和鼠标提示等
2012/10/12 Javascript
js判断undefined变量类型使用typeof
2013/06/03 Javascript
angularjs客户端实现压缩图片文件并上传实例
2015/07/06 Javascript
JavaScript提高性能知识点汇总
2016/01/15 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
详解AngularJs ui-router 路由的简单介绍
2017/04/26 Javascript
websocket+node.js实现实时聊天系统问题咨询
2017/05/17 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
Nodejs下使用gm圆形裁剪并合成图片的示例
2018/02/22 NodeJs
layui实现下拉复选功能的例子(包括数据的回显与上传)
2019/09/24 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
基于vue实现探探滑动组件功能
2020/05/29 Javascript
使用vue实现通过变量动态拼接url
2020/07/22 Javascript
[49:31]TFT vs Mski Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python使用Flask框架获取用户IP地址的方法
2015/03/21 Python
用Python编写一个简单的Lisp解释器的教程
2015/04/03 Python
详解Python中的正则表达式
2018/07/08 Python
pandas筛选某列出现编码错误的解决方法
2018/11/07 Python
python在OpenCV里实现投影变换效果
2019/08/30 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
Python自动化完成tb喵币任务的操作方法
2019/10/30 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
关于迟到的检讨书
2014/01/26 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
社团活动总结格式
2014/08/29 职场文书
合法的离婚协议书范本
2014/10/23 职场文书
2016年母亲节寄语
2015/12/04 职场文书
2016年全国爱眼日宣传教育活动总结
2016/04/05 职场文书
Python实现灰色关联分析与结果可视化的详细代码
2022/03/25 Python
MySQL RC事务隔离的实现
2022/03/31 MySQL