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实现TCP服务器端与客户端的方法详解
Apr 30 Python
python实现爬取千万淘宝商品的方法
Jun 30 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
python获取时间及时间格式转换问题实例代码详解
Dec 06 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
Mar 20 Python
python爬虫学习笔记之Beautifulsoup模块用法详解
Apr 09 Python
使用Python3 poplib模块删除服务器多天前的邮件实现代码
Apr 24 Python
python爬虫实例之获取动漫截图
May 31 Python
解决c++调用python中文乱码问题
Jul 29 Python
python 获取字典特定值对应的键的实现
Sep 29 Python
Python应用自动化部署工具Fabric原理及使用解析
Nov 30 Python
Python Pygame实现俄罗斯方块
Feb 19 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跳转页面的几种实现方法详解
2013/06/08 PHP
深入php多态的实现详解
2013/06/09 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
jQuery 注意事项 与原因分析
2009/04/24 Javascript
IE8 chrome中table隔行换色解决办法
2010/07/09 Javascript
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
javascript之querySelector和querySelectorAll使用说明
2011/10/09 Javascript
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
JavaScript基本编码模式小结
2012/05/23 Javascript
nodejs文件操作模块FS(File System)常用函数简明总结
2014/06/05 NodeJs
jqGrid 学习笔记整理——进阶篇(一 )
2016/04/17 Javascript
微信小程序 五星评价功能的实现
2017/03/09 Javascript
用node和express连接mysql实现登录注册的实现代码
2017/07/05 Javascript
webpack中使用iconfont字体图标的方法
2018/02/22 Javascript
Vuex入门到上手教程
2018/06/20 Javascript
nodejs 使用http进行post或get请求的实例(携带cookie)
2019/01/03 NodeJs
[04:05]TI9战队采访 - Natus Vincere
2019/08/22 DOTA
Python升级提示Tkinter模块找不到的解决方法
2014/08/22 Python
在Python中使用swapCase()方法转换大小写的教程
2015/05/20 Python
python 中的int()函数怎么用
2017/10/17 Python
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
Python简单读写Xls格式文档的方法示例
2018/08/17 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
2020/04/16 Python
意大利在线高尔夫商店:Online Golf
2021/03/09 全球购物
幼儿园保教管理制度
2014/02/03 职场文书
我为自己代言广告词
2014/03/18 职场文书
房屋租赁协议书
2014/04/10 职场文书
学生考试舞弊检讨书
2015/01/01 职场文书
离婚起诉书范本
2015/05/18 职场文书
朋友聚会开场白
2015/06/01 职场文书
预备党员表决心的话
2015/09/22 职场文书
教师节作文之小学四年级
2019/09/03 职场文书
MySQL为id选择合适的数据类型
2021/06/07 MySQL
nginx设置资源请求目录的方式详解
2022/05/30 Servers
SpringBoot详解整合Redis缓存方法
2022/07/15 Java/Android
windows10 家庭版下FTP服务器搭建教程
2022/08/05 Servers