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计算N天之后日期的方法
Mar 31 Python
python环形单链表的约瑟夫问题详解
Sep 27 Python
Python中查看变量的类型内存地址所占字节的大小
Jun 26 Python
python多环境切换及pyenv使用过程详解
Sep 27 Python
Python FtpLib模块应用操作详解
Dec 12 Python
Python argparse模块使用方法解析
Feb 20 Python
python+selenium 脚本实现每天自动登记的思路详解
Mar 11 Python
python 弧度与角度互转实例
Apr 15 Python
关于Keras Dense层整理
May 21 Python
Python如何给你的程序做性能测试
Jul 29 Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 Python
分位数回归模型quantile regeression应用详解及示例教程
Nov 02 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
利用discuz实现PHP大文件上传应用实例代码
2008/11/14 PHP
提高PHP编程效率的53个要点(经验小结)
2010/09/04 PHP
Laravel 5.4.36中session没有保存成功问题的解决
2018/02/19 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
js数组操作学习总结
2013/11/04 Javascript
Javascript Object 对象学习笔记
2014/12/17 Javascript
JS弹出可拖拽可关闭的div层完整实例
2015/02/13 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
javascript基于prototype实现类似OOP继承的方法
2015/12/16 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
JavaScript数组的定义及数字操作技巧
2016/06/06 Javascript
jQuery 跨域访问解决原理案例详解
2016/07/09 Javascript
ion content 滚动到底部会遮住一部分视图的快速解决方法
2016/09/06 Javascript
在iFrame子页面里实现模态框的方法
2018/08/17 Javascript
swiper.js插件实现pc端文本上下滑动功能示例
2018/12/03 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
[01:02:54]完美世界DOTA2联赛PWL S2 FTD vs GXR 第一场 11.22
2020/11/26 DOTA
使用Python中的cookielib模拟登录网站
2015/04/09 Python
python Pandas 读取txt表格的实例
2018/04/29 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
python实现网站微信登录的示例代码
2019/09/18 Python
django 扩展user用户字段inlines方式
2020/03/30 Python
Python识别处理照片中的条形码
2020/11/16 Python
H5 meta小结(前端必看篇)
2016/08/24 HTML / CSS
优衣库台湾官网:UNIQLO台湾
2019/02/01 全球购物
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
linux比较文件内容的命令是什么
2015/09/23 面试题
科学发展观演讲稿
2014/09/11 职场文书
2014年化妆品销售工作总结
2014/12/01 职场文书
店铺转让协议书
2014/12/02 职场文书
建筑工程挂靠协议书
2016/03/23 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
PyTorch dropout设置训练和测试模式的实现
2021/05/27 Python