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实现方法
Nov 18 Python
Python中的字符串类型基本知识学习教程
Feb 04 Python
python 字典(dict)按键和值排序
Jun 28 Python
python爬虫实现教程转换成 PDF 电子书
Feb 19 Python
python中安装Scrapy模块依赖包汇总
Jul 02 Python
python数字图像处理之高级滤波代码详解
Nov 23 Python
numpy判断数值类型、过滤出数值型数据的方法
Jun 09 Python
python样条插值的实现代码
Dec 17 Python
python tkinter库实现气泡屏保和锁屏
Jul 29 Python
python将邻接矩阵输出成图的实现
Nov 21 Python
Python re正则表达式元字符分组()用法分享
Feb 10 Python
教你使用Python pypinyin库实现汉字转拼音
May 27 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
thinkPHP5.0框架验证码调用及点击图片刷新简单实现方法
2018/09/07 PHP
写js时遇到的一些小问题
2010/12/06 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
jquery高效反选具体实现
2013/05/05 Javascript
原生Js实现元素渐隐/渐现(原理为修改元素的css透明度)
2013/06/24 Javascript
浅谈javascript面向对象程序设计
2015/01/21 Javascript
JavaScript将字符串转换成字符编码列表的方法
2015/03/19 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
Javascript实现飞动广告效果的方法
2015/05/25 Javascript
js绘制圆形和矩形的方法
2015/08/05 Javascript
JS简单实现多级Select联动菜单效果代码
2015/09/06 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
2016/04/17 Javascript
JS 滚动事件window.onscroll与position:fixed写兼容IE6的回到顶部组件
2016/10/10 Javascript
bootstrap导航栏、下拉菜单、表单的简单应用实例解析
2017/01/06 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
vue-cli webpack2项目打包优化分享
2018/02/07 Javascript
apicloud拉起小程序并传递参数的方法示例
2018/11/21 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
JavaScript实现随机五位数验证码
2019/09/27 Javascript
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
使用Python横向合并excel文件的实例
2018/12/11 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
python使用xlrd模块读取xlsx文件中的ip方法
2019/01/11 Python
Python设计模式之备忘录模式原理与用法详解
2019/01/15 Python
pandas的qcut()方法详解
2019/07/06 Python
pytorch 图像中的数据预处理和批标准化实例
2020/01/15 Python
纯CSS3实现图片无间断轮播效果
2016/08/25 HTML / CSS
意大利团购网站:Groupon意大利
2016/10/11 全球购物
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
遗失说明具结保证书
2015/02/26 职场文书
2015年专项整治工作总结
2015/04/03 职场文书
redis配置文件中常用配置详解
2021/04/14 Redis